SAMV71 Xplained Ultra Software Package 1.5

etharp.c File Reference

#include "lwip/opt.h"
#include "lwip/inet.h"
#include "lwip/ip.h"
#include "lwip/stats.h"
#include "lwip/snmp.h"
#include "lwip/dhcp.h"
#include "lwip/autoip.h"
#include "netif/etharp.h"
#include <string.h>

Go to the source code of this file.

Data Structures

struct  etharp_entry

Defines

#define ARP_MAXAGE   240
#define ARP_MAXPENDING   2
#define HWTYPE_ETHERNET   1
#define ARPH_HWLEN(hdr)   (ntohs((hdr)->_hwlen_protolen) >> 8)
#define ARPH_PROTOLEN(hdr)   (ntohs((hdr)->_hwlen_protolen) & 0xff)
#define ARPH_HWLEN_SET(hdr, len)   (hdr)->_hwlen_protolen = htons(ARPH_PROTOLEN(hdr) | ((len) << 8))
#define ARPH_PROTOLEN_SET(hdr, len)   (hdr)->_hwlen_protolen = htons((len) | (ARPH_HWLEN(hdr) << 8))
#define ETHARP_TRY_HARD   1
#define ETHARP_FIND_ONLY   2

Enumerations

enum  etharp_state { ETHARP_STATE_EMPTY = 0, ETHARP_STATE_PENDING, ETHARP_STATE_STABLE }

Functions

void etharp_tmr (void)
s8_t etharp_find_addr (struct netif *netif, struct ip_addr *ipaddr, struct eth_addr **eth_ret, struct ip_addr **ip_ret)
void etharp_ip_input (struct netif *netif, struct pbuf *p)
void etharp_arp_input (struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)
err_t etharp_output (struct netif *netif, struct pbuf *q, struct ip_addr *ipaddr)
err_t etharp_query (struct netif *netif, struct ip_addr *ipaddr, struct pbuf *q)
err_t etharp_request (struct netif *netif, struct ip_addr *ipaddr)
err_t ethernet_input (struct pbuf *p, struct netif *netif)

Variables

struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}}
struct eth_addr ethzero = {{0,0,0,0,0,0}}

Detailed Description

Address Resolution Protocol module for IP over Ethernet

Functionally, ARP is divided into two parts. The first maps an IP address to a physical address when sending a packet, and the second part answers requests from other machines for our physical address.

This implementation complies with RFC 826 (Ethernet ARP). It supports Gratuitious ARP from RFC3220 (IP Mobility Support for IPv4) section 4.6 if an interface calls etharp_gratuitous(our_netif) upon address change.

Definition in file etharp.c.


Define Documentation

#define ARP_MAXAGE   240

the time an ARP entry stays valid after its last update, for ARP_TMR_INTERVAL = 5000, this is (240 * 5) seconds = 20 minutes.

Definition at line 68 of file etharp.c.

#define ARP_MAXPENDING   2

the time an ARP entry stays pending after first request, for ARP_TMR_INTERVAL = 5000, this is (2 * 5) seconds = 10 seconds.

Definition at line 76 of file etharp.c.

#define ETHARP_TRY_HARD   1

Try hard to create a new entry - we want the IP address to appear in the cache (even if this means removing an active entry or so).

Definition at line 116 of file etharp.c.


Function Documentation

void etharp_arp_input ( struct netif netif,
struct eth_addr ethaddr,
struct pbuf p 
)

Responds to ARP requests to us. Upon ARP replies to us, add entry to cache send out queued IP packets. Updates cache with snooped address pairs.

Should be called for incoming ARP packets. The pbuf in the argument is freed by this function.

Parameters:
netif The lwIP network interface on which the ARP packet pbuf arrived.
ethaddr Ethernet address of netif.
p The ARP packet that arrived on netif. Is freed by this function.
Returns:
NULL
See also:
pbuf_free()

Definition at line 625 of file etharp.c.

Here is the call graph for this function:

s8_t etharp_find_addr ( struct netif netif,
struct ip_addr ipaddr,
struct eth_addr **  eth_ret,
struct ip_addr **  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

Definition at line 544 of file etharp.c.

void etharp_ip_input ( struct netif netif,
struct pbuf p 
)

Updates the ARP table using the given IP packet.

Uses the incoming IP packet's source address to update the ARP cache for the local network. The function does not alter or free the packet. This function must be called before the packet p is passed to the IP layer.

Parameters:
netif The lwIP network interface on which the IP packet pbuf arrived.
p The IP packet that arrived on netif.
Returns:
NULL
See also:
pbuf_free()

Definition at line 580 of file etharp.c.

err_t etharp_output ( struct netif netif,
struct pbuf q,
struct ip_addr 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().

Definition at line 801 of file etharp.c.

Here is the call graph for this function:

err_t etharp_query ( struct netif netif,
struct ip_addr 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.

Definition at line 892 of file etharp.c.

Here is the call graph for this function:

err_t etharp_request ( struct netif netif,
struct ip_addr 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

Definition at line 1130 of file etharp.c.

void etharp_tmr ( void   ) 

Clears expired entries in the ARP table.

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

Definition at line 165 of file etharp.c.

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

Definition at line 1147 of file etharp.c.

Here is the call graph for this function:

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines