BBN-Vax-TCP/bbnnet/tcp.h

struct th {                     /* tcp header (fits over ip header) */
	struct th *t_next;              /* -> next tcp on rcv chain */
	struct th *t_prev;              /* -> prev tcp on rcv chain */
#ifdef mbb
	short t_x0, t_x00;		/* (for alignment) */
#endif mbb
	unchar t_x1;			/* (unused) */
	unchar t_pr;			/* protocol */
	unsigned short t_len;           /* seg length */
	struct socket t_s;              /* source internet address */
	struct socket t_d;              /* destination internet address */
	unsigned short t_src;           /* source port */
	unsigned short t_dst;           /* destination port */
	sequence t_seq;                 /* sequence number */
	sequence t_ackno;               /* acknowledgement number */
#define t_end(x) (x->t_seq + x->t_len - 1)
#ifndef mbb
	unchar
		t_x2:4,                 /* (unused) */
		t_off:4;                /* data offset */
	unchar
		t_fin:1,                /* fin flag */
		t_syn:1,                /* syn flag */
		t_rst:1,                /* reset flag */
		t_eol:1,                /* eol flag */
		t_ack:1,                /* ack flag */
		t_urg:1,                /* urgent flag */
		t_x3:2;                 /* (unused) */
#else
	unchar
		t_x21:2,		/* (unused) */
		t_off:4,		/* data offset */
		t_x2:4;			/* (unused) */
	unchar
		t_x3:4,			/* (unused) */
		t_urg:1,		/* urgent flag */
		t_ack:1,		/* ack flag */
		t_eol:1,		/* eol flag */
		t_rst:1,		/* reset flag */
		t_syn:1,		/* syn flag */
		t_fin:1;		/* fin flag */
#endif mbb
	unsigned short t_win;           /* window */
	unsigned short t_sum;           /* checksum */
	unsigned short t_urp;           /* urgent pointer */
};

struct tcb {                    /* tcp control block */

	/* various pointers */

	struct th *t_rcv_next;          /* -> first el on rcv queue */
	struct th *t_rcv_prev;          /* -> last el on rcv queue */
	struct tcb *t_tcb_next;         /* -> next tcb */
	struct tcb *t_tcb_prev;         /* -> prev tcb */
	struct ucb *t_ucb;              /* -> ucb */
	struct mbuf *t_rcv_unack;       /* -> unacked message queue */
	char *t_opts;			/* -> ip option string */

	/* sequence number variables */

	sequence iss;                   /* initial send seq # */
	sequence irs;                   /* initial recv seq # */
	sequence rcv_urp;               /* rcv urgent pointer */
	sequence rcv_nxt;               /* next seq # to rcv */
	sequence rcv_end;               /* rcv eol pointer */
	sequence seq_fin;               /* seq # of FIN sent */
	sequence snd_end;               /* send eol pointer */
	sequence snd_urp;               /* snd urgent pointer */
	sequence snd_lst;               /* seq # of last datum to send */
	sequence snd_nxt;               /* seq # of next datum to send */
	sequence snd_una;               /* seq # of first unacked datum */
	sequence snd_wl;                /* seq # of last sent window */
	sequence snd_hi;                /* highest seq # sent */
	sequence snd_wnd;               /* send window max */
	sequence t_rexmt_val;           /* val saved in rexmt timer */
	sequence t_rtl_val;             /* val saved in rexmt too long timer */
	sequence t_xmt_val;             /* seq # sent when xmt timer started */

	/* various flags and state variables */

	unsigned short
		ack_due:1,              /* must we send ACK */
		cancelled:1,            /* retransmit timer cancelled */
		dropped_txt:1,          /* dropped incoming data */
		fin_rcvd:1,             /* FIN received */
		force_one:1,            /* force sending of one byte */
		new_window:1,           /* received new window size */
		rexmt:1,                /* this msg is a retransmission */
		snd_fin:1,              /* FIN should be sent */
		snd_rst:1,              /* RST should be sent */
		snd_urg:1,              /* urgent data to send */
		syn_acked:1,            /* SYN has been ACKed */
		syn_rcvd:1,             /* SYN has been received */
		usr_closed:1,           /* user has closed connection */
		waited_2_ml:1,          /* wait time for FIN ACK is up */
		net_keep:1,             /* don't free this net input */
		usr_abort:1;            /* user has closed and does not expect
					   to receive any more data */

	short t_maxseg;			/* max seg size peer can handle */
	unsigned short t_lport;         /* local port */
	unsigned short t_fport;         /* foreign port */
	unchar t_state;			/* state of this connection */
	unchar t_xmtime;		/* current rexmt time */
	unchar t_optlen;		/* length of ip option string */

	/* timers */

	unchar t_init;			/* initialization too long */
	unchar t_rexmt;			/* retransmission */
	unchar t_rexmttl;		/* retransmit too long */
	unchar t_persist;		/* retransmit persistance */
	unchar t_finack;		/* fin acknowledged */
	unchar t_xmt;			/* round trip transmission time */
};          
	    
/* size of TCP leader (bytes) */
#define TCPSIZE (sizeof(struct th)-sizeof(struct ip))                      

#define ISSINCR 128                     /* increment for iss each second */
#define TCPROTO 6                       /* TCP-4 protocol number */
#define TCPMAXSND 950			/* initial maximum segment size */
#define T_2ML   10                      /* 2*maximum packet lifetime */
#define T_PERS  5                       /* persist time */
#define T_INIT  30                      /* init too long timeout */
#define T_REXMT 1                       /* base for retransmission time */
#define T_REXMTTL 30                    /* retransmit too long timeout */
#define T_REMAX 30                      /* maximum retransmission time */
#define ACTIVE  1                       /* active open */
#define PASSIVE 0                       /* passive open */

sequence firstempty();