Collaboration diagram for ARP:
![]() |
ARP is used to map IP addresses to hardware addresses. Each network interface of Nut/Net keeps its own mapping table.
When an IP packet has to be sent out, IP needs the hardware address to pass it to the Ethernet layer. If the mapping is not in the ARP cache, an Ethernet broadcast packet is sent to the local network requesting the physical hardware address for the given IP address.
Data Structures | |
struct | _ARPENTRY |
ARP entry structure. More... | |
struct | _ARPENTRY |
ARP entry structure. More... | |
ARP Configuration | |
The Nut/OS Configurator may be used to override the default values. | |
#define | MAX_ARPAGE 9 |
Maximum age of an entry in the ARP cache in minutes. | |
#define | MAX_ARPREQUESTS 1 |
Maximum number of ARP requests generated per query. | |
#define | MIN_ARPWAIT 500 |
Minimum wait before sending out a new ARP request. | |
Defines | |
#define | ATF_REM 0x01 |
Entry marked for removal. | |
#define | ATF_COM 0x02 |
Completed entry. | |
#define | ATF_PERM 0x04 |
Permanent entry. | |
Typedefs | |
typedef _ARPENTRY | ARPENTRY |
ARP entry type. | |
Functions | |
void | NutArpCacheUpdate (NUTDEVICE *dev, u_long ip, u_char *ha) |
Update an ARP entry. | |
int | NutArpCacheQuery (NUTDEVICE *dev, CONST u_long ip, u_char *mac) |
Query MAC address for a specified IP address. | |
void | NutArpInput (NUTDEVICE *dev, NETBUF *nb) |
Handle incoming ARP packets. | |
NETBUF * | NutArpAllocNetBuf (u_short type, u_long ip, u_char *mac) |
Allocate an ARP network buffer structure. | |
int | NutArpOutput (NUTDEVICE *dev, NETBUF *nb) |
Send an ARP packet. |
#define ATF_REM 0x01 |
Entry marked for removal.
Definition at line 116 of file if_var.h.
Referenced by NutArpCacheQuery().
#define ATF_COM 0x02 |
Completed entry.
Definition at line 117 of file if_var.h.
Referenced by NutArpCacheQuery(), and NutArpCacheUpdate().
#define ATF_PERM 0x04 |
#define MAX_ARPAGE 9 |
Maximum age of an entry in the ARP cache in minutes.
Outdated entries will be regularly removed, forcing the Ethernet interface to generate new ARP requests. This way MAC address changes are detected.
Definition at line 193 of file arpcache.c.
#define MAX_ARPREQUESTS 1 |
Maximum number of ARP requests generated per query.
If no ARP response is received after sending out the specified number of request, the related IP address is considered unreachable.
Definition at line 204 of file arpcache.c.
Referenced by NutArpCacheQuery().
#define MIN_ARPWAIT 500 |
Minimum wait before sending out a new ARP request.
The specified number of milliseconds will be doubled on each retry.
Definition at line 214 of file arpcache.c.
Referenced by NutArpCacheQuery().
Update an ARP entry.
If an entry with the same IP address exists, then this entry is updated. If no entry exists, a new one is created. All threads waiting for address resolution are woken up.
dev | Identifies the device. | |
ip | Requested IP address in network byte order. | |
ha | Pointer to a buffer which receives the MAC address. |
Definition at line 386 of file arpcache.c.
References __tcp_trf, __tcp_trs, _ARPENTRY::ae_flags, _ARPENTRY::ae_ha, _ARPENTRY::ae_outdated, _ARPENTRY::ae_tq, ATF_COM, ATF_PERM, _NUTDEVICE::dev_icb, fprintf(), fputc(), inet_ntoa(), memcpy(), and NutEventBroadcast().
Referenced by NutArpInput().
Query MAC address for a specified IP address.
If no entry is available in the ARP cache, an incomplete entry is created and ARP requests are generated on increasing time intervals. The calling thread is suspended until a matching ARP response is received or until a number of requests have been generated without receiving a response.
dev | Identifies the device. | |
ip | IP address of which the caller asked the MAC address. | |
mac | Buffer for the retrieved MAC address. |
Definition at line 441 of file arpcache.c.
References _ARPENTRY::ae_flags, _ARPENTRY::ae_ha, ARPOP_REQUEST, ATF_COM, ATF_REM, _NUTDEVICE::dev_icb, MAX_ARPREQUESTS, MIN_ARPWAIT, and NutArpAllocNetBuf().
Handle incoming ARP packets.
Packets not destined to us or packets with unsupported address type or item length are silently discarded.
dev | Identifies the device that received the packet. | |
nb | Pointer to a network buffer structure containing the ARP packet. |
Definition at line 140 of file arpin.c.
References arphdr::ar_hln, arphdr::ar_hrd, arphdr::ar_op, arphdr::ar_pln, arphdr::ar_pro, ether_arp::arp_sha, ether_arp::arp_spa, ether_arp::arp_tpa, ARPHRD_ETHER, ARPOP_REPLY, ARPOP_REQUEST, _NUTDEVICE::dev_icb, ether_arp::ea_hdr, ETHERTYPE_IP, htons, ifnet::if_local_ip, _NETBUF::nb_nw, ntohs, NutArpAllocNetBuf(), NutArpCacheUpdate(), NutArpOutput(), NutNetBufFree(), and _NBDATA::vp.
Referenced by NutEtherInput().
Allocate an ARP network buffer structure.
type | Type of ARP packet. | |
ip | Target IP address. | |
mac | Target MAC address, null pointer for broadcast. |
Definition at line 138 of file arpout.c.
References arphdr::ar_hln, arphdr::ar_hrd, arphdr::ar_op, arphdr::ar_pln, arphdr::ar_pro, ether_arp::arp_tha, ether_arp::arp_tpa, ARPHRD_ETHER, ether_arp::ea_hdr, ETHERTYPE_IP, htons, memcpy(), memset(), _NETBUF::nb_nw, NBAF_NETWORK, NutNetBufAlloc(), and _NBDATA::vp.
Referenced by NutArpCacheQuery(), and NutArpInput().
Send an ARP packet.
dev | Identifies the device to use. | |
nb | Network buffer structure containing the packet to be sent. The structure must have been allocated by a previous call NutNetBufAlloc(). |
Definition at line 183 of file arpout.c.
References ether_arp::arp_sha, ether_arp::arp_spa, ether_arp::arp_tha, _NUTDEVICE::dev_icb, ETHERTYPE_ARP, ifnet::if_local_ip, ifnet::if_mac, ifnet::if_output, memcpy(), _NETBUF::nb_nw, and _NBDATA::vp.
Referenced by NutArpInput().