Commit | Line | Data |
---|---|---|
8ae0e4b4 | 1 | /* |
0880b18e | 2 | * Copyright (c) 1982, 1986 Regents of the University of California. |
8ae0e4b4 KM |
3 | * All rights reserved. The Berkeley software License Agreement |
4 | * specifies the terms and conditions for redistribution. | |
5 | * | |
e1ead9e7 | 6 | * @(#)tcp_var.h 7.5 (Berkeley) %G% |
8ae0e4b4 | 7 | */ |
ad6d0022 BJ |
8 | |
9 | /* | |
10 | * Kernel variables for tcp. | |
11 | */ | |
12 | ||
13 | /* | |
405c9168 | 14 | * Tcp control block, one per tcp; fields: |
ad6d0022 | 15 | */ |
53a5409e | 16 | struct tcpcb { |
a6503abf BJ |
17 | struct tcpiphdr *seg_next; /* sequencing queue */ |
18 | struct tcpiphdr *seg_prev; | |
4aed14e3 | 19 | short t_state; /* state of this connection */ |
a41e26c7 | 20 | short t_timer[TCPT_NTIMERS]; /* tcp timers */ |
405c9168 | 21 | short t_rxtshift; /* log(2) of rexmt exp. backoff */ |
a6bbda13 | 22 | short t_rxtcur; /* current retransmit value */ |
e1ead9e7 | 23 | short t_dupacks; /* consecutive dup acks recd */ |
faa26a98 | 24 | u_short t_maxseg; /* maximum segment size */ |
4aed14e3 | 25 | char t_force; /* 1 if forcing out a byte */ |
2ff61f9d | 26 | u_char t_flags; |
6f638424 MK |
27 | #define TF_ACKNOW 0x01 /* ack peer immediately */ |
28 | #define TF_DELACK 0x02 /* ack, but try to delay it */ | |
29 | #define TF_NODELAY 0x04 /* don't delay packets to coalesce */ | |
30 | #define TF_NOOPT 0x08 /* don't use tcp options */ | |
faa26a98 | 31 | #define TF_SENTFIN 0x10 /* have sent FIN */ |
2ff61f9d BJ |
32 | struct tcpiphdr *t_template; /* skeletal packet for transmit */ |
33 | struct inpcb *t_inpcb; /* back pointer to internet pcb */ | |
ad6d0022 | 34 | /* |
2ff61f9d BJ |
35 | * The following fields are used as in the protocol specification. |
36 | * See RFC783, Dec. 1981, page 21. | |
ad6d0022 | 37 | */ |
2ff61f9d BJ |
38 | /* send sequence variables */ |
39 | tcp_seq snd_una; /* send unacknowledged */ | |
40 | tcp_seq snd_nxt; /* send next */ | |
2ff61f9d BJ |
41 | tcp_seq snd_up; /* send urgent pointer */ |
42 | tcp_seq snd_wl1; /* window update seg seq number */ | |
43 | tcp_seq snd_wl2; /* window update seg ack number */ | |
44 | tcp_seq iss; /* initial send sequence number */ | |
4aed14e3 | 45 | u_short snd_wnd; /* send window */ |
2ff61f9d | 46 | /* receive sequence variables */ |
6f638424 | 47 | u_short rcv_wnd; /* receive window */ |
4aed14e3 | 48 | tcp_seq rcv_nxt; /* receive next */ |
2ff61f9d BJ |
49 | tcp_seq rcv_up; /* receive urgent pointer */ |
50 | tcp_seq irs; /* initial receive sequence number */ | |
ad6d0022 | 51 | /* |
2ff61f9d | 52 | * Additional variables for this implementation. |
ad6d0022 | 53 | */ |
2ff61f9d | 54 | /* receive variables */ |
a6503abf BJ |
55 | tcp_seq rcv_adv; /* advertised window */ |
56 | /* retransmit variables */ | |
a41e26c7 | 57 | tcp_seq snd_max; /* highest sequence number sent |
05586739 MK |
58 | * used to recognize retransmits |
59 | */ | |
e1ead9e7 | 60 | /* congestion control (for slow start, source quench, retransmit after loss) */ |
05586739 | 61 | u_short snd_cwnd; /* congestion-controlled window */ |
e1ead9e7 MK |
62 | u_short snd_ssthresh; /* snd_cwnd size threshhold for |
63 | * for slow start exponential to | |
64 | * linear switch */ | |
7cc62c26 MK |
65 | /* |
66 | * transmit timing stuff. | |
67 | * srtt and rttvar are stored as fixed point; for convenience in smoothing, | |
68 | * srtt has 3 bits to the right of the binary point, rttvar has 2. | |
e1ead9e7 | 69 | * "Variance" is actually smoothed difference. |
7cc62c26 | 70 | */ |
405c9168 BJ |
71 | short t_idle; /* inactivity time */ |
72 | short t_rtt; /* round trip time */ | |
73 | tcp_seq t_rtseq; /* sequence number being timed */ | |
7cc62c26 MK |
74 | short t_srtt; /* smoothed round-trip time */ |
75 | short t_rttvar; /* variance in round-trip time */ | |
e1ead9e7 | 76 | u_short max_rcvd; /* most peer has sent into window */ |
18a438b6 | 77 | u_short max_sndwnd; /* largest window peer has offered */ |
8b5a83bb BJ |
78 | /* out-of-band data */ |
79 | char t_oobflags; /* have some */ | |
b2db9217 | 80 | char t_iobc; /* input character */ |
8b5a83bb | 81 | #define TCPOOB_HAVEDATA 0x01 |
22b0776e | 82 | #define TCPOOB_HADDATA 0x02 |
2ff61f9d | 83 | }; |
ad6d0022 | 84 | |
2ff61f9d BJ |
85 | #define intotcpcb(ip) ((struct tcpcb *)(ip)->inp_ppcb) |
86 | #define sototcpcb(so) (intotcpcb(sotoinpcb(so))) | |
ad6d0022 | 87 | |
3b52afc5 MK |
88 | /* |
89 | * TCP statistics. | |
90 | * Many of these should be kept per connection, | |
91 | * but that's inconvenient at the moment. | |
92 | */ | |
2b4b57cd | 93 | struct tcpstat { |
3b52afc5 MK |
94 | u_long tcps_connattempt; /* connections initiated */ |
95 | u_long tcps_accepts; /* connections accepted */ | |
96 | u_long tcps_connects; /* connections established */ | |
97 | u_long tcps_drops; /* connections dropped */ | |
98 | u_long tcps_conndrops; /* embryonic connections dropped */ | |
99 | u_long tcps_closed; /* conn. closed (includes drops) */ | |
100 | u_long tcps_segstimed; /* segs where we tried to get rtt */ | |
101 | u_long tcps_rttupdated; /* times we succeeded */ | |
102 | u_long tcps_delack; /* delayed acks sent */ | |
103 | u_long tcps_timeoutdrop; /* conn. dropped in rxmt timeout */ | |
104 | u_long tcps_rexmttimeo; /* retransmit timeouts */ | |
105 | u_long tcps_persisttimeo; /* persist timeouts */ | |
106 | u_long tcps_keeptimeo; /* keepalive timeouts */ | |
107 | u_long tcps_keepprobe; /* keepalive probes sent */ | |
108 | u_long tcps_keepdrops; /* connections dropped in keepalive */ | |
109 | ||
110 | u_long tcps_sndtotal; /* total packets sent */ | |
111 | u_long tcps_sndpack; /* data packets sent */ | |
112 | u_long tcps_sndbyte; /* data bytes sent */ | |
113 | u_long tcps_sndrexmitpack; /* data packets retransmitted */ | |
114 | u_long tcps_sndrexmitbyte; /* data bytes retransmitted */ | |
115 | u_long tcps_sndacks; /* ack-only packets sent */ | |
116 | u_long tcps_sndprobe; /* window probes sent */ | |
117 | u_long tcps_sndurg; /* packets sent with URG only */ | |
118 | u_long tcps_sndwinup; /* window update-only packets sent */ | |
119 | u_long tcps_sndctrl; /* control (SYN|FIN|RST) packets sent */ | |
120 | ||
121 | u_long tcps_rcvtotal; /* total packets received */ | |
122 | u_long tcps_rcvpack; /* packets received in sequence */ | |
123 | u_long tcps_rcvbyte; /* bytes received in sequence */ | |
124 | u_long tcps_rcvbadsum; /* packets received with ccksum errs */ | |
125 | u_long tcps_rcvbadoff; /* packets received with bad offset */ | |
126 | u_long tcps_rcvshort; /* packets received too short */ | |
127 | u_long tcps_rcvduppack; /* duplicate-only packets received */ | |
128 | u_long tcps_rcvdupbyte; /* duplicate-only bytes received */ | |
129 | u_long tcps_rcvpartduppack; /* packets with some duplicate data */ | |
130 | u_long tcps_rcvpartdupbyte; /* dup. bytes in part-dup. packets */ | |
131 | u_long tcps_rcvoopack; /* out-of-order packets received */ | |
132 | u_long tcps_rcvoobyte; /* out-of-order bytes received */ | |
133 | u_long tcps_rcvpackafterwin; /* packets with data after window */ | |
134 | u_long tcps_rcvbyteafterwin; /* bytes rcvd after window */ | |
135 | u_long tcps_rcvafterclose; /* packets rcvd after "close" */ | |
136 | u_long tcps_rcvwinprobe; /* rcvd window probe packets */ | |
137 | u_long tcps_rcvdupack; /* rcvd duplicate acks */ | |
138 | u_long tcps_rcvacktoomuch; /* rcvd acks for unsent data */ | |
139 | u_long tcps_rcvackpack; /* rcvd ack packets */ | |
140 | u_long tcps_rcvackbyte; /* bytes acked by rcvd acks */ | |
141 | u_long tcps_rcvwinupd; /* rcvd window update packets */ | |
2b4b57cd BJ |
142 | }; |
143 | ||
ad6d0022 | 144 | #ifdef KERNEL |
2ff61f9d BJ |
145 | struct inpcb tcb; /* head of queue of active tcpcb's */ |
146 | struct tcpstat tcpstat; /* tcp statistics */ | |
53a5409e | 147 | struct tcpiphdr *tcp_template(); |
0e3936fa SL |
148 | struct tcpcb *tcp_close(), *tcp_drop(); |
149 | struct tcpcb *tcp_timers(), *tcp_disconnect(), *tcp_usrclosed(); | |
ad6d0022 | 150 | #endif |