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

TCP/IP协议栈

开发平台:

Visual C++

  1. #ifndef _TCP_H
  2. #define _TCP_H
  3. /* TCP implementation. Follows RFC 793 as closely as possible */
  4. #ifndef _GLOBAL_H
  5. #include "global.h"
  6. #endif
  7. #ifndef _MBUF_H
  8. #include "mbuf.h"
  9. #endif
  10. #ifndef _IFACE_H
  11. #include "iface.h"
  12. #endif
  13. #ifndef _INTERNET_H
  14. #include "internet.h"
  15. #endif
  16. #ifndef _IP_H
  17. #include "ip.h"
  18. #endif
  19. #ifndef _NETUSER_H
  20. #include "netuser.h"
  21. #endif
  22. #ifndef _TIMER_H
  23. #include "timer.h"
  24. #endif
  25. #define DEF_MSS 512 /* Default maximum segment size */
  26. #define DEF_WND 2048 /* Default receiver window */
  27. #define RTTCACHE 16 /* # of TCP round-trip-time cache entries */
  28. #define DEF_RTT 5000 /* Initial guess at round trip time (5 sec) */
  29. #define MSL2 30 /* Guess at two maximum-segment lifetimes */
  30. #define MIN_RTO 500L /* Minimum timeout, milliseconds */
  31. #define TCP_HDR_PAD 70 /* mbuf size to preallocate for headers */
  32. #define DEF_WSCALE 0 /* Our window scale option */
  33. #define geniss() ((int32)msclock() << 12) /* Increment clock at 4 MB/sec */
  34. /* Number of consecutive duplicate acks to trigger fast recovery */
  35. #define TCPDUPACKS 3
  36. /* Round trip timing parameters */
  37. #define AGAIN 8 /* Average RTT gain = 1/8 */
  38. #define LAGAIN 3 /* Log2(AGAIN) */
  39. #define DGAIN 4 /* Mean deviation gain = 1/4 */
  40. #define LDGAIN 2 /* log2(DGAIN) */
  41. /* TCP segment header -- internal representation
  42.  * Note that this structure is NOT the actual header as it appears on the
  43.  * network (in particular, the offset field is missing).
  44.  * All that knowledge is in the functions ntohtcp() and htontcp() in tcpsubr.c
  45.  */
  46. #define TCPLEN 20 /* Minimum Header length, bytes */
  47. #define TCP_MAXOPT 40 /* Largest option field, bytes */
  48. struct tcp {
  49. uint16 source; /* Source port */
  50. uint16 dest; /* Destination port */
  51. int32 seq; /* Sequence number */
  52. int32 ack; /* Acknowledgment number */
  53. uint16 wnd; /* Receiver flow control window */
  54. uint16 checksum; /* Checksum */
  55. uint16 up; /* Urgent pointer */
  56. uint16 mss; /* Optional max seg size */
  57. uint8 wsopt; /* Optional window scale factor */
  58. uint32 tsval; /* Outbound timestamp */
  59. uint32 tsecr; /* Timestamp echo field */
  60. struct {
  61. unsigned int congest:1; /* Echoed IP congestion experienced bit */
  62. unsigned int urg:1;
  63. unsigned int ack:1;
  64. unsigned int psh:1;
  65. unsigned int rst:1;
  66. unsigned int syn:1;
  67. unsigned int fin:1;
  68. unsigned int mss:1; /* MSS option present */
  69. unsigned int wscale:1; /* Window scale option present */
  70. unsigned int tstamp:1; /* Timestamp option present */
  71. } flags;
  72. };
  73. /* TCP options */
  74. #define EOL_KIND 0
  75. #define NOOP_KIND 1
  76. #define MSS_KIND 2
  77. #define MSS_LENGTH 4
  78. #define WSCALE_KIND 3
  79. #define WSCALE_LENGTH 3
  80. #define TSTAMP_KIND 8
  81. #define TSTAMP_LENGTH 10
  82. /* Resequencing queue entry */
  83. struct reseq {
  84. struct reseq *next; /* Linked-list pointer */
  85. struct tcp seg; /* TCP header */
  86. struct mbuf *bp; /* data */
  87. uint16 length; /* data length */
  88. char tos; /* Type of service */
  89. };
  90. /* These numbers match those defined in the MIB for TCP connection state */
  91. enum tcp_state {
  92. TCP_CLOSED=1,
  93. TCP_LISTEN,
  94. TCP_SYN_SENT,
  95. TCP_SYN_RECEIVED,
  96. TCP_ESTABLISHED,
  97. TCP_FINWAIT1,
  98. TCP_FINWAIT2,
  99. TCP_CLOSE_WAIT,
  100. TCP_LAST_ACK,
  101. TCP_CLOSING,
  102. TCP_TIME_WAIT,
  103. };
  104. /* TCP connection control block */
  105. struct tcb {
  106. struct tcb *next; /* Linked list pointer */
  107. struct connection conn;
  108. enum tcp_state state; /* Connection state */
  109. char reason; /* Reason for closing */
  110. #define NORMAL 0 /* Normal close */
  111. #define RESET 1 /* Reset by other end */
  112. #define TIMEOUT 2 /* Excessive retransmissions */
  113. #define NETWORK 3 /* Network problem (ICMP message) */
  114. /* If reason == NETWORK, the ICMP type and code values are stored here */
  115. uint8 type;
  116. uint8 code;
  117. /* Send sequence variables */
  118. struct {
  119. int32 una; /* First unacknowledged sequence number */
  120. int32 nxt; /* Next sequence num to be sent for the first time */
  121. int32 ptr; /* Working transmission pointer */
  122. int32 wl1; /* Sequence number used for last window update */
  123. int32 wl2; /* Ack number used for last window update */
  124. int32 wnd; /* Other end's offered receive window */
  125. uint16 up; /* Send urgent pointer */
  126. uint8 wind_scale;/* Send window scale */
  127. } snd;
  128. int32 iss; /* Initial send sequence number */
  129. int32 resent; /* Count of bytes retransmitted */
  130. int32 cwind; /* Congestion window */
  131. int32 ssthresh; /* Slow-start threshold */
  132. int dupacks; /* Count of duplicate (do-nothing) ACKs */
  133. /* Receive sequence variables */
  134. struct {
  135. int32 nxt; /* Incoming sequence number expected next */
  136. int32 wnd; /* Our offered receive window */
  137. uint16 up; /* Receive urgent pointer */
  138. uint8 wind_scale;/* Recv window scale */
  139. } rcv;
  140. int32 last_ack_sent; /* Last ack sent for timestamp purposes */
  141. int32 ts_recent; /* Most recent incoming timestamp */
  142. int32 irs; /* Initial receive sequence number */
  143. int32 rerecv; /* Count of duplicate bytes received */
  144. int32 mss; /* Maximum segment size */
  145. int32 window; /* Receiver window and send queue limit */
  146. int32 limit; /* Send queue limit */
  147. void (*r_upcall)(struct tcb *tcb,int32 cnt);
  148. /* Call when "significant" amount of data arrives */
  149. void (*t_upcall)(struct tcb *tcb,int32 cnt);
  150. /* Call when ok to send more data */
  151. void (*s_upcall)(struct tcb *tcb,int old,int new);
  152. /* Call when connection state changes */
  153. struct { /* Control flags */
  154. unsigned int force:1; /* We owe the other end an ACK or window update */
  155. unsigned int clone:1; /* Server-type TCB, cloned on incoming SYN */
  156. unsigned int retran:1; /* A retransmission has occurred */
  157. unsigned int active:1; /* TCB created with an active open */
  158. unsigned int synack:1; /* Our SYN has been acked */
  159. unsigned int rtt_run:1; /* We're timing a segment */
  160. unsigned int congest:1; /* Copy of last IP congest bit received */
  161. int ts_ok:1; /* We're using timestamps */
  162. int ws_ok:1; /* We're using window scaling */
  163. } flags;
  164. char tos; /* Type of service (for IP) */
  165. int backoff; /* Backoff interval */
  166. struct mbuf *rcvq; /* Receive queue */
  167. struct mbuf *sndq; /* Send queue */
  168. int32 rcvcnt; /* Count of items on rcvq */
  169. int32 sndcnt; /* Number of unacknowledged sequence numbers on
  170.  * sndq. NB: includes SYN and FIN, which don't
  171.  * actually appear on sndq!
  172.  */
  173. struct reseq *reseq; /* Out-of-order segment queue */
  174. struct timer timer; /* Retransmission timer */
  175. int32 rtt_time; /* Stored clock values for RTT */
  176. int32 rttseq; /* Sequence number being timed */
  177. int32 rttack; /* Ack at start of timing (for txbw calc) */
  178. int32 srtt; /* Smoothed round trip time, milliseconds */
  179. int32 mdev; /* Mean deviation, milliseconds */
  180. int32 rtt; /* Last received RTT (for debugging) */
  181. int user; /* User parameter (e.g., for mapping to an
  182.  * application control block
  183.  */
  184. int32 quench; /* Count of incoming ICMP source quenches */
  185. int32 unreach; /* Count of incoming ICMP unreachables */
  186. int32 timeouts; /* Count of retransmission timeouts */
  187. int32 lastack; /* Time of last received ack */
  188. int32 txbw; /* Estimate of transmit bandwidth */
  189. int32 lastrx; /* Time of last received data */
  190. int32 rxbw; /* Estimate of receive bandwidth */
  191. };
  192. /* TCP round-trip time cache */
  193. struct tcp_rtt {
  194. int32 addr; /* Destination IP address */
  195. int32 srtt; /* Most recent SRTT */
  196. int32 mdev; /* Most recent mean deviation */
  197. };
  198. extern struct tcp_rtt Tcp_rtt[];
  199. extern int (*Kicklist[])();
  200. /* TCP statistics counters */
  201. struct tcp_stat {
  202. uint16 runt; /* Smaller than minimum size */
  203. uint16 checksum; /* TCP header checksum errors */
  204. uint16 conout; /* Outgoing connection attempts */
  205. uint16 conin; /* Incoming connection attempts */
  206. uint16 resets; /* Resets generated */
  207. uint16 bdcsts; /* Bogus broadcast packets */
  208. };
  209. extern struct mib_entry Tcp_mib[];
  210. #define tcpRtoAlgorithm Tcp_mib[1].value.integer
  211. #define tcpRtoMin Tcp_mib[2].value.integer
  212. #define tcpRtoMax Tcp_mib[3].value.integer
  213. #define tcpMaxConn Tcp_mib[4].value.integer
  214. #define tcpActiveOpens Tcp_mib[5].value.integer
  215. #define tcpPassiveOpens Tcp_mib[6].value.integer
  216. #define tcpAttemptFails Tcp_mib[7].value.integer
  217. #define tcpEstabResets Tcp_mib[8].value.integer
  218. #define tcpCurrEstab Tcp_mib[9].value.integer
  219. #define tcpInSegs Tcp_mib[10].value.integer
  220. #define tcpOutSegs Tcp_mib[11].value.integer
  221. #define tcpRetransSegs Tcp_mib[12].value.integer
  222. #define tcpInErrs Tcp_mib[14].value.integer
  223. #define tcpOutRsts Tcp_mib[15].value.integer
  224. #define NUMTCPMIB 15
  225. extern struct tcb *Tcbs;
  226. extern char *Tcpstates[];
  227. extern char *Tcpreasons[];
  228. /* In tcpcmd.c: */
  229. extern int Tcp_tstamps;
  230. extern int32 Tcp_irtt;
  231. extern uint16 Tcp_limit;
  232. extern uint16 Tcp_mss;
  233. extern int Tcp_syndata;
  234. extern int Tcp_trace;
  235. extern uint16 Tcp_window;
  236. void st_tcp(struct tcb *tcb);
  237. /* In tcphdr.c: */
  238. void htontcp(struct tcp *tcph,struct mbuf **data,
  239. int32 ipsrc,int32 ipdest);
  240. int ntohtcp(struct tcp *tcph,struct mbuf **bpp);
  241. /* In tcpin.c: */
  242. void reset(struct ip *ip,struct tcp *seg);
  243. void send_syn(struct tcb *tcb);
  244. void tcp_input(struct iface *iface,struct ip *ip,struct mbuf **bpp,
  245. int rxbroadcast,int32 said);
  246. void tcp_icmp(int32 icsource,int32 source,int32 dest,
  247. uint8 type,uint8 code,struct mbuf **bpp);
  248. /* In tcpsubr.c: */
  249. void close_self(struct tcb *tcb,int reason);
  250. struct tcb *create_tcb(struct connection *conn);
  251. struct tcb *lookup_tcb(struct connection *conn);
  252. void rtt_add(int32 addr,int32 rtt);
  253. struct tcp_rtt *rtt_get(int32 addr);
  254. int seq_ge(int32 x,int32 y);
  255. int seq_gt(int32 x,int32 y);
  256. int seq_le(int32 x,int32 y);
  257. int seq_lt(int32 x,int32 y);
  258. int seq_within(int32 x,int32 low,int32 high);
  259. void settcpstate(struct tcb *tcb,enum tcp_state newstate);
  260. void tcp_garbage(int red);
  261. /* In tcpout.c: */
  262. void tcp_output(struct tcb *tcb);
  263. /* In tcptimer.c: */
  264. int32 backoff(int n);
  265. void tcp_timeout(void *p);
  266. /* In tcpuser.c: */
  267. int close_tcp(struct tcb *tcb);
  268. int del_tcp(struct tcb *tcb);
  269. int kick(int32 addr);
  270. int kick_tcp(struct tcb *tcb);
  271. struct tcb *open_tcp(struct socket *lsocket,struct socket *fsocket,
  272. int mode,uint16 window,
  273. void (*r_upcall)(struct tcb *tcb,int32 cnt),
  274. void (*t_upcall)(struct tcb *tcb,int32 cnt),
  275. void (*s_upcall)(struct tcb *tcb,int old,int new),
  276. int tos,int user);
  277. int32 recv_tcp(struct tcb *tcb,struct mbuf **bpp,int32 cnt);
  278. void reset_all(void);
  279. void reset_tcp(struct tcb *tcb);
  280. long send_tcp(struct tcb *tcb,struct mbuf **bpp);
  281. char *tcp_port(uint16 n);
  282. int tcpval(struct tcb *tcb);
  283. #endif /* _TCP_H */