home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / internet / netlite / NET / h / TCP < prev    next >
Text File  |  1993-03-29  |  8KB  |  201 lines

  1. /* TCP implementation. Follows RFC 793 as closely as possible */
  2.  
  3. #define DEF_WND 2048    /* Default receiver window */
  4. #define NTCB    19      /* # TCB hash table headers */
  5. #define DEF_MSS 512     /* Default maximum segment size */
  6. #define DEF_RTT 5000    /* Initial guess at round trip time (5 sec) */
  7. #define MSL2    30      /* Guess at two maximum-segment lifetimes */
  8. /* Round trip timing parameters */
  9. #define AGAIN   8       /* Average RTT gain = 1/8 */
  10. #define DGAIN   4       /* Mean deviation gain = 1/4 */
  11.  
  12. /* TCP segment header -- internal representation
  13.  * Note that this structure is NOT the actual header as it appears on the
  14.  * network (in particular, the offset and checksum fields are missing).
  15.  * All that knowledge is in the functions ntohtcp() and htontcp() in tcpsubr.c
  16.  */
  17. struct tcp {
  18.         int16 source;   /* Source port */
  19.         int16 dest;     /* Destination port */
  20.         int32 seq;      /* Sequence number */
  21.         int32 ack;      /* Acknowledgment number */
  22.         char flags;     /* Flags, data offset */
  23. #define URG     0x20    /* URGent flag */
  24. #define ACK     0x10    /* ACKnowledgment flag */
  25. #define PSH     0x08    /* PuSH flag */
  26. #define RST     0x04    /* ReSeT flag */
  27. #define SYN     0x02    /* SYNchronize flag */
  28. #define FIN     0x01    /* FINal flag */
  29.         int16 wnd;      /* Receiver flow control window */
  30.         int16 up;       /* Urgent pointer */
  31.         int16 mss;      /* Optional max seg size */
  32. };
  33. /* TCP options */
  34. #define EOL_KIND        0
  35. #define NOOP_KIND       1
  36. #define MSS_KIND        2
  37.  
  38. #define TCPLEN          20
  39. #define MSS_LENGTH      4
  40. /* Resequencing queue entry */
  41. struct reseq {
  42.         struct reseq *next;     /* Linked-list pointer */
  43.         char tos;               /* Type of service */
  44.         struct tcp seg;         /* TCP header */
  45.         struct mbuf *bp;        /* data */
  46.         int16 length;           /* data length */
  47. };
  48. #define NULLRESEQ       (struct reseq *)0
  49.  
  50. /* TCP connection control block */
  51. struct tcb {
  52.         struct tcb *prev;       /* Linked list pointers for hash table */
  53.         struct tcb *next;
  54.  
  55.         struct connection conn;
  56.  
  57.         char state;     /* Connection state */
  58. #define CLOSED          0       /* Must be 0 */
  59. #define LISTEN          1
  60. #define SYN_SENT        2
  61. #define SYN_RECEIVED    3
  62. #define ESTABLISHED     4
  63. #define FINWAIT1        5
  64. #define FINWAIT2        6
  65. #define CLOSE_WAIT      7
  66. #define CLOSING         8
  67. #define LAST_ACK        9
  68. #define TIME_WAIT       10
  69.  
  70.         char reason;            /* Reason for closing */
  71. #define NORMAL          0       /* Normal close */
  72. #define RESET           1       /* Reset by other end */
  73. #define TIMEOUT         2       /* Excessive retransmissions */
  74. #define NETWORK         3       /* Network problem (ICMP message) */
  75.  
  76. /* If reason == NETWORK, the ICMP type and code values are stored here */
  77.         char type;
  78.         char code;
  79.  
  80.         /* Send sequence variables */
  81.         struct {
  82.                 int32 una;      /* First unacknowledged sequence number */
  83.                 int32 nxt;      /* Next sequence num to be sent for the first time */
  84.                 int32 ptr;      /* Working transmission pointer */
  85.                 int16 wnd;      /* Other end's offered receive window */
  86.                 int16 up;       /* Send urgent pointer */
  87.                 int32 wl1;      /* Sequence number used for last window update */
  88.                 int32 wl2;      /* Ack number used for last window update */
  89.         } snd;
  90.         int32 iss;              /* Initial send sequence number */
  91.         int16 cwind;            /* Congestion window */
  92.         int16 ssthresh;         /* Slow-start threshold */
  93.         int32 resent;           /* Count of bytes retransmitted */
  94.  
  95.         /* Receive sequence variables */
  96.         struct {
  97.                 int32 nxt;      /* Incoming sequence number expected next */
  98.                 int16 wnd;      /* Our offered receive window */
  99.                 int16 up;       /* Receive urgent pointer */
  100.         } rcv;
  101.         int32 irs;              /* Initial receive sequence number */
  102.         int16 mss;              /* Maximum segment size */
  103.         int32 rerecv;           /* Count of duplicate bytes received */
  104.  
  105.         int16 window;           /* Receiver window and send queue limit */
  106.  
  107.         char backoff;           /* Backoff interval */
  108.         void (*r_upcall)();     /* Call when "significant" amount of data arrives */
  109.         void (*t_upcall)();     /* Call when ok to send more data */
  110.         void (*s_upcall)();     /* Call when connection state changes */
  111.         char flags;             /* Control flags */
  112. #define FORCE   1               /* We owe the other end an ACK or window update */
  113. #define CLONE   2               /* Server-type TCB, cloned on incoming SYN */
  114. #define RETRAN  4               /* A retransmission has occurred */
  115. #define ACTIVE  8               /* TCB created with an active open */
  116. #define SYNACK  16              /* Our SYN has been acked */
  117.         char tos;               /* Type of service (for IP) */
  118.  
  119.         struct mbuf *rcvq;      /* Receive queue */
  120.         int16 rcvcnt;
  121.  
  122.         struct mbuf *sndq;      /* Send queue */
  123.         int16 sndcnt;           /* Number of unacknowledged sequence numbers on
  124.                                  * send queue. NB: includes SYN and FIN, which don't
  125.                                  * actually appear on sndq!
  126.                                  */
  127.  
  128.  
  129.         struct reseq *reseq;    /* Out-of-order segment queue */
  130.         struct timer timer;     /* Retransmission timer */
  131.         struct timer rtt_timer; /* Round trip timer */
  132.         int32 rttseq;           /* Sequence number being timed */
  133.         int32 srtt;             /* Smoothed round trip time, milliseconds */
  134.         int32 mdev;             /* Mean deviation, milliseconds */
  135.  
  136.         char *user;             /* User parameter (e.g., for mapping to an
  137.                                  * application control block
  138.                                  */
  139. };
  140. #define NULLTCB (struct tcb *)0
  141. /* TCP statistics counters */
  142. struct tcp_stat {
  143.         int16 runt;             /* Smaller than minimum size */
  144.         int16 checksum;         /* TCP header checksum errors */
  145.         int16 conout;           /* Outgoing connection attempts */
  146.         int16 conin;            /* Incoming connection attempts */
  147.         int16 resets;           /* Resets generated */
  148.         int16 bdcsts;           /* Bogus broadcast packets */
  149. };
  150. extern struct tcp_stat tcp_stat;
  151.  
  152. extern struct tcb *tcbs[];
  153.  
  154. /* In TCPCMD */
  155. int dotcp(int, char **);
  156. void tcp_parms(void);
  157.  
  158. /* In TCPIN */
  159. void tcp_input(struct mbuf *, char, int32, int32, char, int16, char);
  160. void tcp_icmp(int32, int32, char, char, struct mbuf **);
  161. void send_syn(struct tcb *);
  162.  
  163. /* In TCPOUT */
  164. void tcp_output(struct tcb *);
  165.  
  166. /* In TCPSUBR */
  167. struct tcb *lookup_tcb(struct connection *);
  168. struct tcb *create_tcb(struct connection *);
  169. void close_self(struct tcb *, char);
  170. int32 iss(void);
  171. int seq_within(int32, int32, int32);
  172. int seq_lt(int32, int32);
  173. int seq_le(int32, int32);
  174. int seq_gt(int32, int32);
  175. int seq_ge(int32, int32);
  176. void link_tcb(struct tcb *);
  177. void unlink_tcb(struct tcb *);
  178. void setstate(struct tcb *, char);
  179. struct mbuf *htontcp(struct tcp *, struct mbuf *, struct pseudo_header *);
  180. int ntohtcp(struct tcp *, struct mbuf **);
  181.  
  182. /* In TCPTIMER*/
  183. void tcp_timeout(char *);
  184. int  backoff(int);
  185.  
  186. /* In TCPUSER */
  187. struct tcb *open_tcp(struct socket *, struct socket *, int, int16,
  188.                      void (*)(), void (*)(), void (*)(), char, char *);
  189. int send_tcp(struct tcb *, struct mbuf *);
  190. int recv_tcp(struct tcb *, struct mbuf **, int16);
  191. int close_tcp(struct tcb *);
  192. int del_tcp(struct tcb *);
  193. int tprintf(struct tcb *, char *, ...);
  194. int tcpval(struct tcb *);
  195. int kick_tcp(struct tcb *);
  196. void reset_tcp(struct tcb *);
  197.  
  198. extern int16 tcp_mss;
  199. extern int16 tcp_window;
  200. extern int32 tcp_irtt;
  201.