/* Size of ARP hash table */ #define ARPSIZE 17 /* Lifetime of a valid ARP entry (seconds) */ #define ARPLIFE (15*60) /* 15 minutes */ /* Lifetime of a pending ARP entry (seconds) */ #define PENDTIME 15 /* 15 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_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 /* Table of hardware types known to ARP */ struct arp_type { int hwalen; /* Hardware length */ int iptype; /* Hardware type field for IP */ int 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[]; /* Format of an ARP request or reply packet. From p. 3 */ struct arp { int16 hardware; /* Hardware type */ int16 protocol; /* Protocol type */ unsigned char hwalen; /* Hardware address length, bytes */ unsigned 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 struct timer timer; /* Time until aging this entry */ struct mbuf *pending; /* Queue of datagrams awaiting resolution */ }; #define NULLARP (struct arp_tab *)NULL extern struct arp_tab *arp_tab[]; struct arp_stat { int recv; /* Total number of ARP packets received */ int badtype; /* Incoming requests for unsupported hardware */ int badlen; /* Incoming length field(s) didn't match types */ int inreq; /* Incoming requests for us */ int replies; /* Replies sent */ int outreq; /* Outoging requests sent */ };