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