Commit | Line | Data |
---|---|---|
2e56471e | 1 | /* tcp.h 1.7 81/10/26 */ |
6e8b2eca BJ |
2 | |
3 | /* | |
4 | * Tcp header (fits over ip header). | |
5 | */ | |
6 | struct 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 | */ | |
37 | struct 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 | */ | |
133 | struct 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 | |
147 | int tcpconsdebug; /* set to 1 traces on console */ | |
148 | struct tcp_debug tcp_debug[TDBSIZE]; | |
149 | int tdbx; /* rotating index into tcp_debug */ | |
150 | #endif | |
151 | #endif |