home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / hamradio / s920603.zip / TCP.H < prev    next >
C/C++ Source or Header  |  1992-05-02  |  10KB  |  311 lines

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