/* Size of ARP hash table */ #define ARPSIZE 17 /* Lifetime of a valid ARP entry */ #define ARPLIFE 900 /* 15 minutes */ /* Lifetime of a pending ARP entry */ #define PENDTIME 30 /* 30 seconds */ /* ARP definitions (see RFC 826) */ /* Address size definitions */ #define IPALEN 4 /* Length in bytes of an IP address */ #define MAXHWALEN 255 /* Maximum length of a hardware address */ /* ARP opcodes */ #define ARP_REQUEST 1 #define ARP_REPLY 2 /* Hardware types */ #define ARP_NETROM 0 /* Fake for NET/ROM (never actually sent) */ #define ARP_ETHER 1 /* Assigned to 10 megabit Ethernet */ #define ARP_EETHER 2 /* Assigned to experimental Ethernet */ #define ARP_AX25 3 /* Assigned to AX.25 Level 2 */ #define ARP_PRONET 4 /* Assigned to PROnet token ring */ #define ARP_CHAOS 5 /* Assigned to Chaosnet */ #define ARP_ARCNET 7 #define ARP_APPLETALK 8 extern char *arptypes[]; /* Type fields in ASCII, defined in arpcmd */ #define NHWTYPES 9 /* Table of hardware types known to ARP */ struct arp_type { int16 hwalen; /* Hardware length */ int16 iptype; /* Hardware type field for IP */ int16 arptype; /* Hardware type field for ARP */ char *bdcst; /* Hardware broadcast address */ int (*format)(); /* Function that formats addresses */ int (*scan)(); /* Reverse of format */ }; extern struct arp_type arp_type[]; #define NULLATYPE (struct arp_type *)0 /* Format of an ARP request or reply packet. From p. 3 */ struct arp { int16 hardware; /* Hardware type */ int16 protocol; /* Protocol type */ char hwalen; /* Hardware address length, bytes */ char pralen; /* Length of protocol address */ int16 opcode; /* ARP opcode (request/reply) */ char shwaddr[MAXHWALEN]; /* Sender hardware address field */ int32 sprotaddr; /* Sender Protocol address field */ char thwaddr[MAXHWALEN]; /* Target hardware address field */ int32 tprotaddr; /* Target protocol address field */ }; /* Format of ARP table */ struct arp_tab { struct arp_tab *next; /* Doubly-linked list pointers */ struct arp_tab *prev; int32 ip_addr; /* IP Address, host order */ int16 hardware; /* Hardware type */ char *hw_addr; /* Hardware address */ char state; /* (In)complete */ #define ARP_PENDING 0 #define ARP_VALID 1 char pub; /* Respond to requests for this entry? */ struct timer timer; /* Time until aging this entry */ struct mbuf *pending; /* Queue of datagrams awaiting resolution */ }; struct arp_tab *arp_lookup(),*arp_add(); #define NULLARP (struct arp_tab *)0 extern struct arp_tab *arp_tab[]; struct arp_stat { unsigned recv; /* Total number of ARP packets received */ unsigned badtype; /* Incoming requests for unsupported hardware */ unsigned badlen; /* Incoming length field(s) didn't match types */ unsigned badaddr; /* Bogus incoming addresses */ unsigned inreq; /* Incoming requests for us */ unsigned replies; /* Replies sent */ unsigned outreq; /* Outoging requests sent */ };