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

TCP/IP协议栈

开发平台:

Visual C++

  1. #ifndef _IP_H
  2. #define _IP_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 _INTERNET_H
  13. #include "internet.h"
  14. #endif
  15. #ifndef _TIMER_H
  16. #include "timer.h"
  17. #endif
  18. #define TLB 30 /* Default reassembly timeout, sec */
  19. #define IPVERSION 4
  20. #define IP_CS_OLD 1 /* use saved checksum */
  21. #define IP_CS_NEW 0 /* calculate checksum */
  22. extern char Hashtab[]; /* Modulus lookup table */
  23. /* SNMP MIB variables, used for statistics and control. See RFC 1066 */
  24. extern struct mib_entry Ip_mib[];
  25. #define ipForwarding Ip_mib[1].value.integer
  26. #define ipDefaultTTL Ip_mib[2].value.integer
  27. #define ipInReceives Ip_mib[3].value.integer
  28. #define ipInHdrErrors Ip_mib[4].value.integer
  29. #define ipInAddrErrors Ip_mib[5].value.integer
  30. #define ipForwDatagrams Ip_mib[6].value.integer
  31. #define ipInUnknownProtos Ip_mib[7].value.integer
  32. #define ipInDiscards Ip_mib[8].value.integer
  33. #define ipInDelivers Ip_mib[9].value.integer
  34. #define ipOutRequests Ip_mib[10].value.integer
  35. #define ipOutDiscards Ip_mib[11].value.integer
  36. #define ipOutNoRoutes Ip_mib[12].value.integer
  37. #define ipReasmTimeout Ip_mib[13].value.integer
  38. #define ipReasmReqds Ip_mib[14].value.integer
  39. #define ipReasmOKs Ip_mib[15].value.integer
  40. #define ipReasmFails Ip_mib[16].value.integer
  41. #define ipFragOKs Ip_mib[17].value.integer
  42. #define ipFragFails Ip_mib[18].value.integer
  43. #define ipFragCreates Ip_mib[19].value.integer
  44. #define NUMIPMIB 19
  45. /* IP header, INTERNAL representation */
  46. #define IPLEN 20 /* Length of standard IP header */
  47. #define IP_MAXOPT 40 /* Largest option field, bytes */
  48. struct ip {
  49. int32 source; /* Source address */
  50. int32 dest; /* Destination address */
  51. uint16 length; /* Total length */
  52. uint16 id; /* Identification */
  53. uint16 offset; /* Fragment offset in bytes */
  54. uint16 checksum; /* Header checksum */
  55. struct {
  56. unsigned int congest:1; /* Congestion experienced bit (exp) */
  57. unsigned int df:1; /* Don't fragment flag */
  58. unsigned int mf:1; /* More Fragments flag */
  59. } flags;
  60. uint8 version; /* IP version number */
  61. uint8 tos; /* Type of service */
  62. uint8 ttl; /* Time to live */
  63. uint8 protocol; /* Protocol */
  64. uint8 optlen; /* Length of options field, bytes */
  65. uint8 options[IP_MAXOPT];/* Options field */
  66. };
  67. /* Fields in option type byte */
  68. #define OPT_COPIED 0x80 /* Copied-on-fragmentation flag */
  69. #define OPT_CLASS 0x60 /* Option class */
  70. #define OPT_NUMBER 0x1f /* Option number */
  71. /* IP option numbers */
  72. #define IP_EOL 0 /* End of options list */
  73. #define IP_NOOP 1 /* No Operation */
  74. #define IP_SECURITY 2 /* Security parameters */
  75. #define IP_LSROUTE 3 /* Loose Source Routing */
  76. #define IP_TIMESTAMP 4 /* Internet Timestamp */
  77. #define IP_RROUTE 7 /* Record Route */
  78. #define IP_STREAMID 8 /* Stream ID */
  79. #define IP_SSROUTE 9 /* Strict Source Routing */
  80. /* Timestamp option flags */
  81. #define TS_ONLY 0 /* Time stamps only */
  82. #define TS_ADDRESS 1 /* Addresses + Time stamps */
  83. #define TS_PRESPEC 3 /* Prespecified addresses only */
  84. /* IP routing table entry */
  85. struct route {
  86. struct route *prev; /* Linked list pointers */
  87. struct route *next;
  88. int32 target; /* Target IP address */
  89. unsigned int bits; /* Number of significant bits in target */
  90. int32 gateway; /* IP address of local gateway for this target */
  91. int32 metric; /* Hop count or whatever */
  92. struct iface *iface; /* Device interface structure */
  93. struct {
  94. unsigned int rtprivate:1; /* Don't advertise this route */
  95. unsigned int rttrig:1; /* Trigger is pending for this route */
  96. } flags;
  97. struct timer timer; /* Time until aging of this entry */
  98. int32 uses; /* Usage count */
  99. };
  100. extern struct route *Routes[32][HASHMOD]; /* Routing table */
  101. extern struct route R_default; /* Default route entry */
  102. /* Cache for the last-used routing entry, speeds up the common case where
  103.  * we handle a burst of packets to the same destination
  104.  */
  105. struct rt_cache {
  106. int32 target;
  107. struct route *route;
  108. };
  109. extern struct rt_cache Rt_cache[];
  110. extern int32 Rtlookups; /* Count of calls to rt_lookup() */
  111. extern int32 Rtchits; /* Count of cache hits in rt_lookup() */
  112. extern uint16 Id_cntr; /* Datagram serial number */
  113. /* Reassembly descriptor */
  114. struct reasm {
  115. struct reasm *next; /* Linked list pointer */
  116. struct timer timer; /* Reassembly timeout timer */
  117. struct frag *fraglist; /* Head of data fragment chain */
  118. uint16 length; /* Entire datagram length, if known */
  119. int32 source; /* src/dest/id/protocol uniquely describe a datagram */
  120. int32 dest;
  121. uint16 id;
  122. char protocol;
  123. };
  124. /* Fragment descriptor in a reassembly list */
  125. struct frag {
  126. struct frag *prev; /* Previous fragment on list */
  127. struct frag *next; /* Next fragment */
  128. struct mbuf *buf; /* Actual fragment data */
  129. uint16 offset; /* Starting offset of fragment */
  130. uint16 last; /* Ending offset of fragment */
  131. };
  132. extern struct reasm *Reasmq; /* The list of reassembly descriptors */
  133. /* Structure for handling raw IP user sockets */
  134. struct raw_ip {
  135. struct raw_ip *next; /* Linked list pointer */
  136. struct mbuf *rcvq; /* receive queue */
  137. void (*r_upcall)(struct raw_ip *);
  138. int protocol; /* Protocol */
  139. int user; /* User linkage */
  140. };
  141. extern struct raw_ip *Raw_ip;
  142. /* Transport protocol link table */
  143. struct iplink {
  144. char proto;
  145. char *name;
  146. void (*funct)(struct iface *,struct ip *,struct mbuf **,int,int32);
  147. void (*dump)(FILE *,struct mbuf **,int32,int32,int);
  148. };
  149. extern struct iplink Iplink[];
  150. /* List of TCP port numbers to be given priority queuing */
  151. extern int Tcp_interact[];
  152. extern int Ip_trace;
  153. /* In ip.c: */
  154. void ip_garbage(int drastic);
  155. void ip_recv(struct iface *iface,struct ip *ip,struct mbuf **bpp,
  156. int rxbroadcast, int32 said);
  157. void ipip_recv(struct iface *iface,struct ip *ip,struct mbuf **bp,
  158. int rxbroadcast,int32 said);
  159. int ip_send(int32 source,int32 dest,char protocol,char tos,char ttl,
  160. struct mbuf **bpp,uint16 length,uint16 id,char df);
  161. struct raw_ip *raw_ip(int protocol,void (*r_upcall)(struct raw_ip *) );
  162. void del_ip(struct raw_ip *rrp);
  163. void rquench(struct iface *ifp,int drop);
  164. /* In ipdump.c */
  165. void dumpip(struct iface *iface,struct ip *ip,struct mbuf *bp,int32 spi);
  166. /* In iproute.c: */
  167. void ipinit(void);
  168. uint16 ip_mtu(int32 addr);
  169. void encap_tx(int dev,void *arg1,void *unused);
  170. int ip_encap(struct mbuf **bpp,struct iface *iface,int32 gateway,uint8 tos);
  171. void ip_proc(struct iface *iface,struct mbuf **bpp);
  172. int ip_route(struct iface *i_iface,struct mbuf **bpp,int rxbroadcast);
  173. int32 locaddr(int32 addr);
  174. void rt_merge(int trace);
  175. struct route *rt_add(int32 target,unsigned int bits,int32 gateway,
  176. struct iface *iface,int32 metric,int32 ttl,uint8 private);
  177. int rt_drop(int32 target,unsigned int bits);
  178. struct route *rt_lookup(int32 target);
  179. struct route *rt_blookup(int32 target,unsigned int bits);
  180. /* In iphdr.c: */
  181. uint16 cksum(struct pseudo_header *ph,struct mbuf *m,uint16 len);
  182. uint16 eac(int32 sum);
  183. void htonip(struct ip *ip,struct mbuf **data,int cflag);
  184. int ntohip(struct ip *ip,struct mbuf **bpp);
  185. /* In either lcsum.c or pcgen.asm: */
  186. uint16 lcsum(uint16 *wp,uint16 len);
  187. /* In sim.c: */
  188. void net_sim(struct mbuf *bp);
  189. #endif /* _IP_H */