Rtos API example
lwip_etharp.c File Reference
Address Resolution Protocol module for IP over Ethernet. More...
Go to the source code of this file.
Enumerations | |
enum | etharp_state |
ARP states. More... | |
Functions | |
static void | free_etharp_q (struct etharp_q_entry *q) |
Free a complete queue of etharp entries. | |
static void | etharp_free_entry (int i) |
Clean up ARP table entries. | |
void | etharp_tmr (void) |
Clears expired entries in the ARP table. | |
static s8_t | etharp_find_entry (const ip4_addr_t *ipaddr, u8_t flags, struct netif *netif) |
Search the ARP table for a matching or new entry. | |
static err_t | etharp_update_arp_entry (struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, u8_t flags) |
Update (or insert) a IP/MAC address pair in the ARP cache. |
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 lwip_etharp.c.
Enumeration Type Documentation
enum etharp_state |
ARP states.
Definition at line 80 of file lwip_etharp.c.
Function Documentation
static s8_t etharp_find_entry | ( | const ip4_addr_t * | ipaddr, |
u8_t | flags, | ||
struct netif * | netif | ||
) | [static] |
Search the ARP table for a matching or new entry.
If an IP address is given, return a pending or stable ARP entry that matches the address. If no match is found, create a new entry with this address set, but in state ETHARP_EMPTY. The caller must check and possibly change the state of the returned entry.
If ipaddr is NULL, return a initialized new entry in state ETHARP_EMPTY.
In all cases, attempt to create new entries from an empty entry. If no empty entries are available and ETHARP_FLAG_TRY_HARD flag is set, recycle old entries. Heuristic choose the least important entry for recycling.
- Parameters:
-
ipaddr IP address to find in ARP cache, or to add if not found. flags See etharp_state netif netif related to this address (used for NETIF_HWADDRHINT)
- Returns:
- The ARP entry index that matched or is created, ERR_MEM if no entry is found or could be recycled.
a) do a search through the cache, remember candidates b) select candidate entry c) create new entry
Definition at line 258 of file lwip_etharp.c.
static void etharp_free_entry | ( | int | i ) | [static] |
Clean up ARP table entries.
Definition at line 170 of file lwip_etharp.c.
void etharp_tmr | ( | void | ) |
Clears expired entries in the ARP table.
This function should be called every ARP_TMR_INTERVAL milliseconds (1 second), in order to expire entries in the ARP table.
Definition at line 199 of file lwip_etharp.c.
static err_t etharp_update_arp_entry | ( | struct netif * | netif, |
const ip4_addr_t * | ipaddr, | ||
struct eth_addr * | ethaddr, | ||
u8_t | flags | ||
) | [static] |
Update (or insert) a IP/MAC address pair in the ARP cache.
If a pending entry is resolved, any queued packets will be sent at this point.
- Parameters:
-
netif netif related to this entry (used for NETIF_ADDRHINT) ipaddr IP address of the inserted ARP entry. ethaddr Ethernet address of the inserted ARP entry. flags See etharp_state
- Returns:
- ERR_OK Successfully updated ARP cache.
- ERR_MEM If we could not add a new ARP entry when ETHARP_FLAG_TRY_HARD was set.
- ERR_ARG Non-unicast address given, those will not appear in ARP cache.
- See also:
- pbuf_free()
Add a new static entry to the ARP table. If an entry exists for the specified IP address, this entry is overwritten. If packets are queued for the specified IP address, they are sent out.
- Parameters:
-
ipaddr IP address for the new static entry ethaddr ethernet address for the new static entry
- Returns:
- See return values of etharp_add_static_entry
Remove a static entry from the ARP table previously added with a call to etharp_add_static_entry.
- Parameters:
-
ipaddr IP address of the static entry to remove
- Returns:
- ERR_OK: entry removed ERR_MEM: entry wasn't found ERR_ARG: entry wasn't a static entry but a dynamic one
Remove all ARP table entries of the specified netif.
- Parameters:
-
netif points to a network interface
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
Possibility to iterate over stable ARP table entries
- Parameters:
-
i entry number, 0 to ARP_TABLE_SIZE ipaddr return value: IP address netif return value: points to interface eth_ret return value: ETH address
- Returns:
- 1 on valid index, 0 otherwise
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:
-
p The ARP packet that arrived on netif. Is freed by this function. netif The lwIP network interface on which the ARP packet pbuf arrived.
- See also:
- pbuf_free()
Just a small helper function that sends a pbuf to an ethernet address in the arp_table specified by the index 'arp_idx'.
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 ethernet_output().
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.
Send a raw ARP packet (opcode and all addresses can be modified)
- Parameters:
-
netif the lwip network interface on which to send the ARP packet ethsrc_addr the source MAC address for the ethernet header ethdst_addr the destination MAC address for the ethernet header hwsrc_addr the source MAC address for the ARP protocol header ipsrc_addr the source IP address for the ARP protocol header hwdst_addr the destination MAC address for the ARP protocol header ipdst_addr the destination IP address for the ARP protocol header opcode the type of the ARP packet
- Returns:
- ERR_OK if the ARP packet has been sent ERR_MEM if the ARP packet couldn't be allocated any other err_t on failure
Send an ARP request packet asking for ipaddr to a specific eth address. Used to send unicast request to refresh the ARP table just before an entry times out
- Parameters:
-
netif the lwip network interface on which to send the request ipaddr the IP address for which to ask hw_dst_addr the ethernet address to send this packet to
- 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
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 424 of file lwip_etharp.c.
static void free_etharp_q | ( | struct etharp_q_entry * | q ) | [static] |
Free a complete queue of etharp entries.
- Parameters:
-
q a qeueue of etharp_q_entry's to free
Definition at line 148 of file lwip_etharp.c.
Generated on Sun Jul 17 2022 08:25:34 by 1.7.2