arp.h
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:4k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. #ifndef _ARP_H
  2. #define _ARP_H
  3. #ifndef _GLOBAL_H
  4. #include "global.h"
  5. #endif
  6. #ifndef _MBUF_H
  7. #include "mbuf.h"
  8. #endif
  9. #ifndef _IFACE_H
  10. #include "iface.h"
  11. #endif
  12. #ifndef _TIMER_H
  13. #include "timer.h"
  14. #endif
  15. /* Lifetime of a valid ARP entry */
  16. #define ARPLIFE 900 /* 15 minutes */
  17. /* Lifetime of a pending ARP entry */
  18. #define PENDTIME 15 /* 15 seconds */
  19. /* ARP definitions (see RFC 826) */
  20. #define ARPLEN 16 /* Size of ARP hdr, minus hardware addresses */
  21. /* Address size definitions */
  22. #define IPALEN 4 /* Length in bytes of an IP address */
  23. #define MAXHWALEN 20 /* Maximum length of a hardware address */
  24. /* ARP opcodes */
  25. enum arp_opcode {
  26. ARP_REQUEST=1,
  27. ARP_REPLY,
  28. REVARP_REQUEST,
  29. REVARP_REPLY
  30. };
  31. /* Hardware types */
  32. enum arp_hwtype {
  33. ARP_NETROM=0, /* Fake for NET/ROM (never actually sent) */
  34. ARP_ETHER, /* Assigned to 10 megabit Ethernet */
  35. ARP_EETHER, /* Assigned to experimental Ethernet */
  36. ARP_AX25, /* Assigned to AX.25 Level 2 */
  37. ARP_PRONET, /* Assigned to PROnet token ring */
  38. ARP_CHAOS, /* Assigned to Chaosnet */
  39. ARP_IEEE802, /* Who uses this? */
  40. ARP_ARCNET,
  41. ARP_APPLETALK
  42. };
  43. extern char *Arptypes[]; /* Type fields in ASCII, defined in arpcmd */
  44. #define NHWTYPES 9
  45. /* Table of hardware types known to ARP */
  46. struct arp_type {
  47. uint16 hwalen; /* Hardware length */
  48. uint16 iptype; /* Hardware type field for IP */
  49. uint16 arptype; /* Hardware type field for ARP */
  50. uint16 pendtime; /* # secs to wait pending response */
  51. uint8 *bdcst; /* Hardware broadcast address */
  52. char *(*format)(char *,uint8 *);
  53. /* Function that formats addresses */
  54. int (*scan)(uint8 *,char *);
  55. /* Reverse of format */
  56. };
  57. extern struct arp_type Arp_type[];
  58. /* Format of an ARP request or reply packet. From p. 3 */
  59. struct arp {
  60. enum arp_hwtype hardware; /* Hardware type */
  61. uint16 protocol; /* Protocol type */
  62. uint8 hwalen; /* Hardware address length, bytes */
  63. uint8 pralen; /* Length of protocol address */
  64. enum arp_opcode opcode; /* ARP opcode (request/reply) */
  65. uint8 shwaddr[MAXHWALEN]; /* Sender hardware address field */
  66. int32 sprotaddr; /* Sender Protocol address field */
  67. uint8 thwaddr[MAXHWALEN]; /* Target hardware address field */
  68. int32 tprotaddr; /* Target protocol address field */
  69. };
  70. /* Format of ARP table */
  71. struct arp_tab {
  72. struct arp_tab *next; /* Doubly-linked list pointers */
  73. struct arp_tab *prev;
  74. struct timer timer; /* Time until aging this entry */
  75. struct mbuf *pending; /* Queue of datagrams awaiting resolution */
  76. int32 ip_addr; /* IP Address, host order */
  77. enum arp_hwtype hardware; /* Hardware type */
  78. enum {
  79. ARP_PENDING, /* Incomplete */
  80. ARP_VALID /* Complete */
  81. } state;
  82. uint8 *hw_addr; /* Hardware address */
  83. unsigned int pub:1; /* Respond to requests for this entry? */
  84. };
  85. extern struct arp_tab *Arp_tab[];
  86. struct arp_stat {
  87. unsigned recv; /* Total number of ARP packets received */
  88. unsigned badtype; /* Incoming requests for unsupported hardware */
  89. unsigned badlen; /* Incoming length field(s) didn't match types */
  90. unsigned badaddr; /* Bogus incoming addresses */
  91. unsigned inreq; /* Incoming requests for us */
  92. unsigned replies; /* Replies sent */
  93. unsigned outreq; /* Outoging requests sent */
  94. };
  95. extern struct arp_stat Arp_stat;
  96. /* In arp.c: */
  97. struct arp_tab *arp_add(int32 ipaddr,enum arp_hwtype hardware,uint8 *hw_addr,
  98. int pub);
  99. void arp_drop(void *p);
  100. int arp_init(unsigned int hwtype,int hwalen,int iptype,int arptype,
  101. int pendtime,uint8 *bdcst,char *(*format)(char *,uint8 *),
  102. int  (*scan)(uint8 *,char *) );
  103. void arp_input(struct iface *iface,struct mbuf **bpp);
  104. struct arp_tab *arp_lookup(enum arp_hwtype hardware,int32 ipaddr);
  105. uint8 *res_arp(struct iface *iface,enum arp_hwtype hardware,int32 target,struct mbuf **bpp);
  106. /* In arphdr.c: */
  107. struct mbuf *htonarp(struct arp *arp);
  108. int ntoharp(struct arp *arp,struct mbuf **bpp);
  109. #endif /* _ARP_H */