Classes | Defines | Functions | Variables

alexb/lib/lwip/contrib/src/include/netif/etharp.h File Reference

#include "lwip/opt.h"
#include "lwip/pbuf.h"
#include "lwip/ip_addr.h"
#include "lwip/netif.h"
#include "lwip/ip.h"

Classes

struct  eth_addr
struct  eth_hdr
 Ethernet header. More...
struct  etharp_hdr
 the ARP message, see RFC 826 ("Packet format") More...

Defines

#define ETHARP_HWADDR_LEN   6
#define SIZEOF_ETH_HDR   (14 + ETH_PAD_SIZE)
#define SIZEOF_ETHARP_HDR   28
#define SIZEOF_ETHARP_PACKET   (SIZEOF_ETH_HDR + SIZEOF_ETHARP_HDR)
#define ARP_TMR_INTERVAL   5000
 5 seconds period
#define ETHTYPE_ARP   0x0806U
#define ETHTYPE_IP   0x0800U
#define ETHTYPE_VLAN   0x8100U
#define ETHTYPE_PPPOEDISC   0x8863U
#define ETHTYPE_PPPOE   0x8864U
#define ETHADDR32_COPY(src, dst)   SMEMCPY(src, dst, ETHARP_HWADDR_LEN)
 MEMCPY-like macro to copy to/from struct eth_addr's that are local variables or known to be 32-bit aligned within the protocol header.
#define ETHADDR16_COPY(src, dst)   SMEMCPY(src, dst, ETHARP_HWADDR_LEN)
 MEMCPY-like macro to copy to/from struct eth_addr's that are no local variables and known to be 16-bit aligned within the protocol header.
#define ARP_REQUEST   1
 ARP message types (opcodes).
#define ARP_REPLY   2
#define LWIP_ARP_FILTER_NETIF   0
 Define this to 1 and define LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type) to a filter function that returns the correct netif when using multiple netifs on one hardware interface where the netif's low-level receive routine cannot decide for the correct netif (e.g.
#define etharp_init()
#define etharp_gratuitous(netif)   etharp_request((netif), &(netif)->ip_addr)
 For Ethernet network interfaces, we might want to send "gratuitous ARP"; this is an ARP packet sent by a node in order to spontaneously cause other nodes to update an entry in their ARP cache.
#define eth_addr_cmp(addr1, addr2)   (memcmp((addr1)->addr, (addr2)->addr, ETHARP_HWADDR_LEN) == 0)

Functions

void etharp_tmr (void)
 Clears expired entries in the ARP table.
s8_t etharp_find_addr (struct netif *netif, ip_addr_t *ipaddr, struct eth_addr **eth_ret, ip_addr_t **ip_ret)
 Finds (stable) ethernet/IP address pair from ARP table using interface and IP address index.
err_t etharp_output (struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr)
 Resolve and fill-in Ethernet address header for outgoing IP packet.
err_t etharp_query (struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q)
 Send an ARP request for the given IP address and/or queue a packet.
err_t etharp_request (struct netif *netif, ip_addr_t *ipaddr)
 Send an ARP request packet asking for ipaddr.
err_t ethernet_input (struct pbuf *p, struct netif *netif)
 Process received ethernet frames.

Variables

PACK_STRUCT_BEGIN struct eth_addr PACK_STRUCT_STRUCT
 Ethernet header.
struct eth_addr ethbroadcast ethzero

Define Documentation

#define ARP_REPLY   2
#define ARP_REQUEST   1

ARP message types (opcodes).

#define ARP_TMR_INTERVAL   5000

5 seconds period

#define eth_addr_cmp (   addr1,
  addr2 
)    (memcmp((addr1)->addr, (addr2)->addr, ETHARP_HWADDR_LEN) == 0)
#define ETHADDR16_COPY (   src,
  dst 
)    SMEMCPY(src, dst, ETHARP_HWADDR_LEN)

MEMCPY-like macro to copy to/from struct eth_addr's that are no local variables and known to be 16-bit aligned within the protocol header.

#define ETHADDR32_COPY (   src,
  dst 
)    SMEMCPY(src, dst, ETHARP_HWADDR_LEN)

MEMCPY-like macro to copy to/from struct eth_addr's that are local variables or known to be 32-bit aligned within the protocol header.

#define etharp_gratuitous (   netif  )     etharp_request((netif), &(netif)->ip_addr)

For Ethernet network interfaces, we might want to send "gratuitous ARP"; this is an ARP packet sent by a node in order to spontaneously cause other nodes to update an entry in their ARP cache.

From RFC 3220 "IP Mobility Support for IPv4" section 4.6.

#define ETHARP_HWADDR_LEN   6
#define etharp_init (  ) 
#define ETHTYPE_ARP   0x0806U
#define ETHTYPE_IP   0x0800U
#define ETHTYPE_PPPOE   0x8864U
#define ETHTYPE_PPPOEDISC   0x8863U
#define ETHTYPE_VLAN   0x8100U
#define LWIP_ARP_FILTER_NETIF   0

Define this to 1 and define LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type) to a filter function that returns the correct netif when using multiple netifs on one hardware interface where the netif's low-level receive routine cannot decide for the correct netif (e.g.

when mapping multiple IP addresses to one hardware interface).

#define SIZEOF_ETH_HDR   (14 + ETH_PAD_SIZE)
#define SIZEOF_ETHARP_HDR   28
#define SIZEOF_ETHARP_PACKET   (SIZEOF_ETH_HDR + SIZEOF_ETHARP_HDR)

Function Documentation

s8_t etharp_find_addr ( struct netif netif,
ip_addr_t ipaddr,
struct eth_addr **  eth_ret,
ip_addr_t **  ip_ret 
)

Finds (stable) ethernet/IP address pair from ARP table using interface and IP address index.

Note:
the addresses in the ARP table are in network order!
Parameters:
netif points to interface index
ipaddr points to the (network order) IP address index
eth_ret points to return pointer
ip_ret points to return pointer
Returns:
table index if found, -1 otherwise
err_t etharp_output ( struct netif netif,
struct pbuf q,
ip_addr_t ipaddr 
)

Resolve and fill-in Ethernet address header for outgoing IP packet.

For IP multicast and broadcast, corresponding Ethernet addresses are selected and the packet is transmitted on the link.

For unicast addresses, the packet is submitted to etharp_query(). In case the IP address is outside the local network, the IP address of the gateway is used.

Parameters:
netif The lwIP network interface which the IP packet will be sent on.
q The pbuf(s) containing the IP packet to be sent.
ipaddr The IP address of the packet destination.
Returns:
  • ERR_RTE No route to destination (no gateway to external networks), or the return type of either etharp_query() or etharp_send_ip().
err_t etharp_query ( struct netif netif,
ip_addr_t ipaddr,
struct pbuf q 
)

Send an ARP request for the given IP address and/or queue a packet.

If the IP address was not yet in the cache, a pending ARP cache entry is added and an ARP request is sent for the given address. The packet is queued on this entry.

If the IP address was already pending in the cache, a new ARP request is sent for the given address. The packet is queued on this entry.

If the IP address was already stable in the cache, and a packet is given, it is directly sent and no ARP request is sent out.

If the IP address was already stable in the cache, and no packet is given, an ARP request is sent out.

Parameters:
netif The lwIP network interface on which ipaddr must be queried for.
ipaddr The IP address to be resolved.
q If non-NULL, a pbuf that must be delivered to the IP address. q is not freed by this function.
Note:
q must only be ONE packet, not a packet queue!
Returns:
  • ERR_BUF Could not make room for Ethernet header.
  • ERR_MEM Hardware address unknown, and no more ARP entries available to query for address or queue the packet.
  • ERR_MEM Could not queue packet due to memory shortage.
  • ERR_RTE No route to destination (no gateway to external networks).
  • ERR_ARG Non-unicast address given, those will not appear in ARP cache.
err_t etharp_request ( struct netif netif,
ip_addr_t ipaddr 
)

Send an ARP request packet asking for ipaddr.

Parameters:
netif the lwip network interface on which to send the request
ipaddr the IP address for which to ask
Returns:
ERR_OK if the request has been sent ERR_MEM if the ARP packet couldn't be allocated any other err_t on failure
void etharp_tmr ( void   ) 

Clears expired entries in the ARP table.

This function should be called every ETHARP_TMR_INTERVAL milliseconds (5 seconds), in order to expire entries in the ARP table.

err_t ethernet_input ( struct pbuf p,
struct netif netif 
)

Process received ethernet frames.

Using this function instead of directly calling ip_input and passing ARP frames through etharp in ethernetif_input, the ARP cache is protected from concurrent access.

Parameters:
p the recevied packet, p->payload pointing to the ethernet header
netif the network interface on which the packet was received

Variable Documentation

PACK_STRUCT_BEGIN struct etharp_hdr PACK_STRUCT_STRUCT

Ethernet header.

the ARP message, see RFC 826 ("Packet format")

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines