first compiled halfbrid... not working yet
[unix-history] / usr / src / sys / netinet / tcp.h
CommitLineData
2e56471e 1/* tcp.h 1.7 81/10/26 */
6e8b2eca
BJ
2
3/*
4 * Tcp header (fits over ip header).
5 */
6struct th {
7 struct th *t_next; /* -> next tcp on rcv chain */
8 struct th *t_prev; /* -> prev tcp on rcv chain */
9 u_char t_x1; /* (unused) */
10 u_char t_pr; /* protocol */
11 u_short t_len; /* seg length */
12 struct socket t_s; /* source internet address */
13 struct socket t_d; /* destination internet address */
14 u_short t_src; /* source port */
15 u_short t_dst; /* destination port */
16 seq_t t_seq; /* sequence number */
17 seq_t t_ackno; /* acknowledgement number */
18#define t_end(x) (x->t_seq + x->t_len - 1)
19 u_char
20 t_x2:4, /* (unused) */
21 t_off:4; /* data offset */
a3d78bbd
BJ
22 u_char th_flags;
23#define TH_FIN 001
24#define TH_SYN 002
25#define TH_RST 004
26#define TH_EOL 010
27#define TH_ACK 020
28#define TH_URG 040
6e8b2eca
BJ
29 u_short t_win; /* window */
30 u_short t_sum; /* checksum */
31 u_short t_urp; /* urgent pointer */
121f5f3a
BJ
32};
33
6e8b2eca
BJ
34/*
35 * Tcp control block.
36 */
37struct tcb {
38 struct th *t_rcv_next; /* first el on rcv queue */
39 struct th *t_rcv_prev; /* last el on rcv queue */
40 struct tcb *t_tcb_next; /* next tcb */
41 struct tcb *t_tcb_prev; /* next tcb */
42 struct ucb *t_ucb; /* ucb */
43 struct mbuf *t_rcv_unack; /* unacked message queue */
44 seq_t iss; /* initial send seq # */
45 seq_t irs; /* initial recv seq # */
46 seq_t rcv_urp; /* rcv urgent pointer */
47 seq_t rcv_nxt; /* next seq # to rcv */
48 seq_t rcv_end; /* rcv eol pointer */
49 seq_t snd_off; /* seq # of first datum in send buf */
50 seq_t seq_fin; /* seq # of FIN sent */
51 seq_t snd_end; /* send eol pointer */
52 seq_t snd_urp; /* snd urgent pointer */
53 seq_t snd_lst; /* seq # of last sent datum */
54 seq_t snd_nxt; /* seq # of next datum to send */
55 seq_t snd_una; /* seq # of first unacked datum */
56 seq_t snd_wl; /* seq # of last sent window */
57 seq_t snd_hi; /* highest seq # sent */
58 seq_t snd_wnd; /* send window max */
59 seq_t t_rexmt_val; /* val saved in rexmt timer */
60 seq_t t_rtl_val; /* val saved in rexmt too long timer */
61 seq_t t_xmt_val; /* seq # sent when xmt timer started */
121f5f3a 62
6e8b2eca 63 /* various flags and state variables */
121f5f3a 64
a3d78bbd
BJ
65 u_short tc_flags;
66#define TC_ACK_DUE 0x0001 /* must we send ACK */
67#define TC_CANCELLED 0x0002 /* retransmit timer cancelled */
68#define TC_DROPPED_TXT 0x0004 /* dropped incoming data */
69#define TC_FIN_RCVD 0x0008 /* FIN received */
70#define TC_FORCE_ONE 0x0010 /* force sending of one byte */
71#define TC_NEW_WINDOW 0x0020 /* received new window size */
72#define TC_REXMT 0x0040 /* this msg is a retransmission */
73#define TC_SND_FIN 0x0080 /* FIN should be sent */
74#define TC_SND_RST 0x0100 /* RST should be sent */
75#define TC_SND_URG 0x0200 /* urgent data to send */
76#define TC_SYN_ACKED 0x0400 /* SYN has been ACKed */
77#define TC_SYN_RCVD 0x0800 /* SYN has been received */
78#define TC_USR_CLOSED 0x1000 /* user has closed connection */
79#define TC_WAITED_2_ML 0x2000 /* wait time for FIN ACK is up */
80#define TC_NET_KEEP 0x4000 /* don't free this net input */
81#define TC_USR_ABORT 0x8000 /* user has closed and does not expect
6e8b2eca 82 to receive any more data */
a3d78bbd 83
6e8b2eca
BJ
84 u_short t_lport; /* local port */
85 u_short t_fport; /* foreign port */
86 u_char t_state; /* state of this connection */
87 u_char t_xmtime; /* current rexmt time */
121f5f3a 88
6e8b2eca 89 /* timers */
121f5f3a 90
6e8b2eca
BJ
91 u_char t_init; /* initialization too long */
92 u_char t_rexmt; /* retransmission */
93 u_char t_rexmttl; /* retransmit too long */
94 u_char t_persist; /* retransmit persistance */
95 u_char t_finack; /* fin acknowledged */
96 u_char t_xmt; /* round trip transmission time */
97};
121f5f3a 98
6e8b2eca
BJ
99/*
100 * Tcp machine predicates
101 */
102#define ack_ok(x, y) \
a3d78bbd
BJ
103 (((y)->th_flags&TH_ACK)==0 || \
104 ((x)->iss < (y)->t_ackno && (y)->t_ackno <= (x)->snd_hi))
121f5f3a 105
6e8b2eca 106#define syn_ok(x, y) \
a3d78bbd 107 ((y)->th_flags&TH_SYN)
121f5f3a 108
6e8b2eca
BJ
109#define ack_fin(x, y) \
110 ((x)->seq_fin > (x)->iss && (y)->t_ackno > (x)->seq_fin)
121f5f3a 111
6e8b2eca 112#define rcv_empty(x) \
a3d78bbd 113 (((x)->tc_flags&TC_USR_ABORT) || \
6e8b2eca 114 ((x)->t_ucb->uc_rbuf == NULL && (x)->t_rcv_next == (x)->t_rcv_prev))
186b5a8a
BJ
115
116#define ISSINCR 128 /* increment for iss each second */
117#define TCPROTO 6 /* TCP-4 protocol number */
118#define TCPSIZE 20 /* size of TCP leader (bytes) */
119#define T_2ML 10 /* 2*maximum packet lifetime */
120#define T_PERS 5 /* persist time */
121#define T_INIT 30 /* init too long timeout */
122#define T_REXMT 1 /* base for retransmission time */
123#define T_REXMTTL 30 /* retransmit too long timeout */
124#define T_REMAX 30 /* maximum retransmission time */
125#define ACTIVE 1 /* active open */
126#define PASSIVE 0 /* passive open */
127
128#ifdef TCPDEBUG
129#define TDBSIZE 50
130/*
131 * Tcp debugging record.
132 */
133struct tcp_debug {
134 long td_tod; /* time of day */
135 struct tcb *td_tcb; /* -> tcb */
136 char td_old; /* old state */
137 char td_inp; /* input */
138 char td_tim; /* timer id */
139 char td_new; /* new state */
140 seq_t td_sno; /* seq_t number */
141 seq_t td_ano; /* acknowledgement */
142 u_short td_wno; /* window */
143 u_short td_lno; /* length */
144 u_char td_flg; /* message flags */
145};
146#ifdef KERNEL
147int tcpconsdebug; /* set to 1 traces on console */
148struct tcp_debug tcp_debug[TDBSIZE];
149int tdbx; /* rotating index into tcp_debug */
150#endif
151#endif