1 | /*- |
---|
2 | * Copyright (c) 1982, 1986, 1993, 1994, 1995 |
---|
3 | * The Regents of the University of California. All rights reserved. |
---|
4 | * |
---|
5 | * Redistribution and use in source and binary forms, with or without |
---|
6 | * modification, are permitted provided that the following conditions |
---|
7 | * are met: |
---|
8 | * 1. Redistributions of source code must retain the above copyright |
---|
9 | * notice, this list of conditions and the following disclaimer. |
---|
10 | * 2. Redistributions in binary form must reproduce the above copyright |
---|
11 | * notice, this list of conditions and the following disclaimer in the |
---|
12 | * documentation and/or other materials provided with the distribution. |
---|
13 | * 4. Neither the name of the University nor the names of its contributors |
---|
14 | * may be used to endorse or promote products derived from this software |
---|
15 | * without specific prior written permission. |
---|
16 | * |
---|
17 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
---|
18 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
---|
19 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
---|
20 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
---|
21 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
---|
22 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
---|
23 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
---|
24 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
---|
25 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
---|
26 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
---|
27 | * SUCH DAMAGE. |
---|
28 | * |
---|
29 | * @(#)tcp_var.h 8.4 (Berkeley) 5/24/95 |
---|
30 | * $FreeBSD$ |
---|
31 | */ |
---|
32 | |
---|
33 | #ifndef _NETINET_TCP_VAR_H_ |
---|
34 | #define _NETINET_TCP_VAR_H_ |
---|
35 | |
---|
36 | #include <netinet/tcp.h> |
---|
37 | |
---|
38 | #ifdef _KERNEL |
---|
39 | #include <net/vnet.h> |
---|
40 | |
---|
41 | /* |
---|
42 | * Kernel variables for tcp. |
---|
43 | */ |
---|
44 | VNET_DECLARE(int, tcp_do_rfc1323); |
---|
45 | #define V_tcp_do_rfc1323 VNET(tcp_do_rfc1323) |
---|
46 | |
---|
47 | #endif /* _KERNEL */ |
---|
48 | |
---|
49 | /* TCP segment queue entry */ |
---|
50 | struct tseg_qent { |
---|
51 | LIST_ENTRY(tseg_qent) tqe_q; |
---|
52 | int tqe_len; /* TCP segment data length */ |
---|
53 | struct tcphdr *tqe_th; /* a pointer to tcp header */ |
---|
54 | struct mbuf *tqe_m; /* mbuf contains packet */ |
---|
55 | }; |
---|
56 | LIST_HEAD(tsegqe_head, tseg_qent); |
---|
57 | |
---|
58 | struct sackblk { |
---|
59 | tcp_seq start; /* start seq no. of sack block */ |
---|
60 | tcp_seq end; /* end seq no. */ |
---|
61 | }; |
---|
62 | |
---|
63 | struct sackhole { |
---|
64 | tcp_seq start; /* start seq no. of hole */ |
---|
65 | tcp_seq end; /* end seq no. */ |
---|
66 | tcp_seq rxmit; /* next seq. no in hole to be retransmitted */ |
---|
67 | TAILQ_ENTRY(sackhole) scblink; /* scoreboard linkage */ |
---|
68 | }; |
---|
69 | |
---|
70 | struct sackhint { |
---|
71 | struct sackhole *nexthole; |
---|
72 | int sack_bytes_rexmit; |
---|
73 | |
---|
74 | int ispare; /* explicit pad for 64bit alignment */ |
---|
75 | uint64_t _pad[2]; /* 1 sacked_bytes, 1 TBD */ |
---|
76 | }; |
---|
77 | |
---|
78 | struct tcptemp { |
---|
79 | u_char tt_ipgen[40]; /* the size must be of max ip header, now IPv6 */ |
---|
80 | struct tcphdr tt_t; |
---|
81 | }; |
---|
82 | |
---|
83 | #define tcp6cb tcpcb /* for KAME src sync over BSD*'s */ |
---|
84 | |
---|
85 | /* Neighbor Discovery, Neighbor Unreachability Detection Upper layer hint. */ |
---|
86 | #ifdef INET6 |
---|
87 | #define ND6_HINT(tp) \ |
---|
88 | do { \ |
---|
89 | if ((tp) && (tp)->t_inpcb && \ |
---|
90 | ((tp)->t_inpcb->inp_vflag & INP_IPV6) != 0) \ |
---|
91 | nd6_nud_hint(NULL, NULL, 0); \ |
---|
92 | } while (0) |
---|
93 | #else |
---|
94 | #define ND6_HINT(tp) |
---|
95 | #endif |
---|
96 | |
---|
97 | /* |
---|
98 | * Tcp control block, one per tcp; fields: |
---|
99 | * Organized for 16 byte cacheline efficiency. |
---|
100 | */ |
---|
101 | struct tcpcb { |
---|
102 | struct tsegqe_head t_segq; /* segment reassembly queue */ |
---|
103 | void *t_pspare[2]; /* new reassembly queue */ |
---|
104 | int t_segqlen; /* segment reassembly queue length */ |
---|
105 | int t_dupacks; /* consecutive dup acks recd */ |
---|
106 | |
---|
107 | struct tcp_timer *t_timers; /* All the TCP timers in one struct */ |
---|
108 | |
---|
109 | struct inpcb *t_inpcb; /* back pointer to internet pcb */ |
---|
110 | int t_state; /* state of this connection */ |
---|
111 | u_int t_flags; |
---|
112 | |
---|
113 | struct vnet *t_vnet; /* back pointer to parent vnet */ |
---|
114 | |
---|
115 | tcp_seq snd_una; /* send unacknowledged */ |
---|
116 | tcp_seq snd_max; /* highest sequence number sent; |
---|
117 | * used to recognize retransmits |
---|
118 | */ |
---|
119 | tcp_seq snd_nxt; /* send next */ |
---|
120 | tcp_seq snd_up; /* send urgent pointer */ |
---|
121 | |
---|
122 | tcp_seq snd_wl1; /* window update seg seq number */ |
---|
123 | tcp_seq snd_wl2; /* window update seg ack number */ |
---|
124 | tcp_seq iss; /* initial send sequence number */ |
---|
125 | tcp_seq irs; /* initial receive sequence number */ |
---|
126 | |
---|
127 | tcp_seq rcv_nxt; /* receive next */ |
---|
128 | tcp_seq rcv_adv; /* advertised window */ |
---|
129 | u_long rcv_wnd; /* receive window */ |
---|
130 | tcp_seq rcv_up; /* receive urgent pointer */ |
---|
131 | |
---|
132 | u_long snd_wnd; /* send window */ |
---|
133 | u_long snd_cwnd; /* congestion-controlled window */ |
---|
134 | u_long snd_bwnd; /* bandwidth-controlled window */ |
---|
135 | u_long snd_ssthresh; /* snd_cwnd size threshold for |
---|
136 | * for slow start exponential to |
---|
137 | * linear switch |
---|
138 | */ |
---|
139 | u_long snd_bandwidth; /* calculated bandwidth or 0 */ |
---|
140 | tcp_seq snd_recover; /* for use in NewReno Fast Recovery */ |
---|
141 | |
---|
142 | u_int t_maxopd; /* mss plus options */ |
---|
143 | |
---|
144 | u_int t_rcvtime; /* inactivity time */ |
---|
145 | u_int t_starttime; /* time connection was established */ |
---|
146 | u_int t_rtttime; /* RTT measurement start time */ |
---|
147 | tcp_seq t_rtseq; /* sequence number being timed */ |
---|
148 | |
---|
149 | u_int t_bw_rtttime; /* used for bandwidth calculation */ |
---|
150 | tcp_seq t_bw_rtseq; /* used for bandwidth calculation */ |
---|
151 | |
---|
152 | int t_rxtcur; /* current retransmit value (ticks) */ |
---|
153 | u_int t_maxseg; /* maximum segment size */ |
---|
154 | int t_srtt; /* smoothed round-trip time */ |
---|
155 | int t_rttvar; /* variance in round-trip time */ |
---|
156 | |
---|
157 | int t_rxtshift; /* log(2) of rexmt exp. backoff */ |
---|
158 | u_int t_rttmin; /* minimum rtt allowed */ |
---|
159 | u_int t_rttbest; /* best rtt we've seen */ |
---|
160 | u_long t_rttupdated; /* number of times rtt sampled */ |
---|
161 | u_long max_sndwnd; /* largest window peer has offered */ |
---|
162 | |
---|
163 | int t_softerror; /* possible error not yet reported */ |
---|
164 | /* out-of-band data */ |
---|
165 | char t_oobflags; /* have some */ |
---|
166 | char t_iobc; /* input character */ |
---|
167 | /* RFC 1323 variables */ |
---|
168 | u_char snd_scale; /* window scaling for send window */ |
---|
169 | u_char rcv_scale; /* window scaling for recv window */ |
---|
170 | u_char request_r_scale; /* pending window scaling */ |
---|
171 | u_int32_t ts_recent; /* timestamp echo data */ |
---|
172 | u_int ts_recent_age; /* when last updated */ |
---|
173 | u_int32_t ts_offset; /* our timestamp offset */ |
---|
174 | |
---|
175 | tcp_seq last_ack_sent; |
---|
176 | /* experimental */ |
---|
177 | u_long snd_cwnd_prev; /* cwnd prior to retransmit */ |
---|
178 | u_long snd_ssthresh_prev; /* ssthresh prior to retransmit */ |
---|
179 | tcp_seq snd_recover_prev; /* snd_recover prior to retransmit */ |
---|
180 | u_int t_badrxtwin; /* window for retransmit recovery */ |
---|
181 | u_char snd_limited; /* segments limited transmitted */ |
---|
182 | /* SACK related state */ |
---|
183 | int snd_numholes; /* number of holes seen by sender */ |
---|
184 | TAILQ_HEAD(sackhole_head, sackhole) snd_holes; |
---|
185 | /* SACK scoreboard (sorted) */ |
---|
186 | tcp_seq snd_fack; /* last seq number(+1) sack'd by rcv'r*/ |
---|
187 | int rcv_numsacks; /* # distinct sack blks present */ |
---|
188 | struct sackblk sackblks[MAX_SACK_BLKS]; /* seq nos. of sack blocks */ |
---|
189 | tcp_seq sack_newdata; /* New data xmitted in this recovery |
---|
190 | episode starts at this seq number */ |
---|
191 | struct sackhint sackhint; /* SACK scoreboard hint */ |
---|
192 | int t_rttlow; /* smallest observerved RTT */ |
---|
193 | u_int32_t rfbuf_ts; /* recv buffer autoscaling timestamp */ |
---|
194 | int rfbuf_cnt; /* recv buffer autoscaling byte count */ |
---|
195 | struct toe_usrreqs *t_tu; /* offload operations vector */ |
---|
196 | void *t_toe; /* TOE pcb pointer */ |
---|
197 | int t_bytes_acked; /* # bytes acked during current RTT */ |
---|
198 | |
---|
199 | int t_ispare; /* explicit pad for 64bit alignment */ |
---|
200 | void *t_pspare2[6]; /* 2 CC / 4 TBD */ |
---|
201 | uint64_t _pad[12]; /* 7 UTO, 5 TBD (1-2 CC/RTT?) */ |
---|
202 | }; |
---|
203 | |
---|
204 | /* |
---|
205 | * Flags and utility macros for the t_flags field. |
---|
206 | */ |
---|
207 | #define TF_ACKNOW 0x000001 /* ack peer immediately */ |
---|
208 | #define TF_DELACK 0x000002 /* ack, but try to delay it */ |
---|
209 | #define TF_NODELAY 0x000004 /* don't delay packets to coalesce */ |
---|
210 | #define TF_NOOPT 0x000008 /* don't use tcp options */ |
---|
211 | #define TF_SENTFIN 0x000010 /* have sent FIN */ |
---|
212 | #define TF_REQ_SCALE 0x000020 /* have/will request window scaling */ |
---|
213 | #define TF_RCVD_SCALE 0x000040 /* other side has requested scaling */ |
---|
214 | #define TF_REQ_TSTMP 0x000080 /* have/will request timestamps */ |
---|
215 | #define TF_RCVD_TSTMP 0x000100 /* a timestamp was received in SYN */ |
---|
216 | #define TF_SACK_PERMIT 0x000200 /* other side said I could SACK */ |
---|
217 | #define TF_NEEDSYN 0x000400 /* send SYN (implicit state) */ |
---|
218 | #define TF_NEEDFIN 0x000800 /* send FIN (implicit state) */ |
---|
219 | #define TF_NOPUSH 0x001000 /* don't push */ |
---|
220 | #define TF_MORETOCOME 0x010000 /* More data to be appended to sock */ |
---|
221 | #define TF_LQ_OVERFLOW 0x020000 /* listen queue overflow */ |
---|
222 | #define TF_LASTIDLE 0x040000 /* connection was previously idle */ |
---|
223 | #define TF_RXWIN0SENT 0x080000 /* sent a receiver win 0 in response */ |
---|
224 | #define TF_FASTRECOVERY 0x100000 /* in NewReno Fast Recovery */ |
---|
225 | #define TF_WASFRECOVERY 0x200000 /* was in NewReno Fast Recovery */ |
---|
226 | #define TF_SIGNATURE 0x400000 /* require MD5 digests (RFC2385) */ |
---|
227 | #define TF_FORCEDATA 0x800000 /* force out a byte */ |
---|
228 | #define TF_TSO 0x1000000 /* TSO enabled on this connection */ |
---|
229 | #define TF_TOE 0x2000000 /* this connection is offloaded */ |
---|
230 | #define TF_ECN_PERMIT 0x4000000 /* connection ECN-ready */ |
---|
231 | #define TF_ECN_SND_CWR 0x8000000 /* ECN CWR in queue */ |
---|
232 | #define TF_ECN_SND_ECE 0x10000000 /* ECN ECE in queue */ |
---|
233 | |
---|
234 | #define IN_FASTRECOVERY(tp) (tp->t_flags & TF_FASTRECOVERY) |
---|
235 | #define ENTER_FASTRECOVERY(tp) tp->t_flags |= TF_FASTRECOVERY |
---|
236 | #define EXIT_FASTRECOVERY(tp) tp->t_flags &= ~TF_FASTRECOVERY |
---|
237 | |
---|
238 | /* |
---|
239 | * Flags for the t_oobflags field. |
---|
240 | */ |
---|
241 | #define TCPOOB_HAVEDATA 0x01 |
---|
242 | #define TCPOOB_HADDATA 0x02 |
---|
243 | |
---|
244 | #ifdef TCP_SIGNATURE |
---|
245 | /* |
---|
246 | * Defines which are needed by the xform_tcp module and tcp_[in|out]put |
---|
247 | * for SADB verification and lookup. |
---|
248 | */ |
---|
249 | #define TCP_SIGLEN 16 /* length of computed digest in bytes */ |
---|
250 | #define TCP_KEYLEN_MIN 1 /* minimum length of TCP-MD5 key */ |
---|
251 | #define TCP_KEYLEN_MAX 80 /* maximum length of TCP-MD5 key */ |
---|
252 | /* |
---|
253 | * Only a single SA per host may be specified at this time. An SPI is |
---|
254 | * needed in order for the KEY_ALLOCSA() lookup to work. |
---|
255 | */ |
---|
256 | #define TCP_SIG_SPI 0x1000 |
---|
257 | #endif /* TCP_SIGNATURE */ |
---|
258 | |
---|
259 | /* |
---|
260 | * Structure to hold TCP options that are only used during segment |
---|
261 | * processing (in tcp_input), but not held in the tcpcb. |
---|
262 | * It's basically used to reduce the number of parameters |
---|
263 | * to tcp_dooptions and tcp_addoptions. |
---|
264 | * The binary order of the to_flags is relevant for packing of the |
---|
265 | * options in tcp_addoptions. |
---|
266 | */ |
---|
267 | struct tcpopt { |
---|
268 | u_int64_t to_flags; /* which options are present */ |
---|
269 | #define TOF_MSS 0x0001 /* maximum segment size */ |
---|
270 | #define TOF_SCALE 0x0002 /* window scaling */ |
---|
271 | #define TOF_SACKPERM 0x0004 /* SACK permitted */ |
---|
272 | #define TOF_TS 0x0010 /* timestamp */ |
---|
273 | #define TOF_SIGNATURE 0x0040 /* TCP-MD5 signature option (RFC2385) */ |
---|
274 | #define TOF_SACK 0x0080 /* Peer sent SACK option */ |
---|
275 | #define TOF_MAXOPT 0x0100 |
---|
276 | u_int32_t to_tsval; /* new timestamp */ |
---|
277 | u_int32_t to_tsecr; /* reflected timestamp */ |
---|
278 | u_char *to_sacks; /* pointer to the first SACK blocks */ |
---|
279 | u_char *to_signature; /* pointer to the TCP-MD5 signature */ |
---|
280 | u_int16_t to_mss; /* maximum segment size */ |
---|
281 | u_int8_t to_wscale; /* window scaling */ |
---|
282 | u_int8_t to_nsacks; /* number of SACK blocks */ |
---|
283 | }; |
---|
284 | |
---|
285 | /* |
---|
286 | * Flags for tcp_dooptions. |
---|
287 | */ |
---|
288 | #define TO_SYN 0x01 /* parse SYN-only options */ |
---|
289 | |
---|
290 | struct hc_metrics_lite { /* must stay in sync with hc_metrics */ |
---|
291 | u_long rmx_mtu; /* MTU for this path */ |
---|
292 | u_long rmx_ssthresh; /* outbound gateway buffer limit */ |
---|
293 | u_long rmx_rtt; /* estimated round trip time */ |
---|
294 | u_long rmx_rttvar; /* estimated rtt variance */ |
---|
295 | u_long rmx_bandwidth; /* estimated bandwidth */ |
---|
296 | u_long rmx_cwnd; /* congestion window */ |
---|
297 | u_long rmx_sendpipe; /* outbound delay-bandwidth product */ |
---|
298 | u_long rmx_recvpipe; /* inbound delay-bandwidth product */ |
---|
299 | }; |
---|
300 | |
---|
301 | #ifndef _NETINET_IN_PCB_H_ |
---|
302 | struct in_conninfo; |
---|
303 | #endif /* _NETINET_IN_PCB_H_ */ |
---|
304 | |
---|
305 | struct tcptw { |
---|
306 | struct inpcb *tw_inpcb; /* XXX back pointer to internet pcb */ |
---|
307 | tcp_seq snd_nxt; |
---|
308 | tcp_seq rcv_nxt; |
---|
309 | tcp_seq iss; |
---|
310 | tcp_seq irs; |
---|
311 | u_short last_win; /* cached window value */ |
---|
312 | u_short tw_so_options; /* copy of so_options */ |
---|
313 | struct ucred *tw_cred; /* user credentials */ |
---|
314 | u_int32_t t_recent; |
---|
315 | u_int32_t ts_offset; /* our timestamp offset */ |
---|
316 | u_int t_starttime; |
---|
317 | int tw_time; |
---|
318 | TAILQ_ENTRY(tcptw) tw_2msl; |
---|
319 | }; |
---|
320 | |
---|
321 | #define intotcpcb(ip) ((struct tcpcb *)(ip)->inp_ppcb) |
---|
322 | #define intotw(ip) ((struct tcptw *)(ip)->inp_ppcb) |
---|
323 | #define sototcpcb(so) (intotcpcb(sotoinpcb(so))) |
---|
324 | |
---|
325 | /* |
---|
326 | * The smoothed round-trip time and estimated variance |
---|
327 | * are stored as fixed point numbers scaled by the values below. |
---|
328 | * For convenience, these scales are also used in smoothing the average |
---|
329 | * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed). |
---|
330 | * With these scales, srtt has 3 bits to the right of the binary point, |
---|
331 | * and thus an "ALPHA" of 0.875. rttvar has 2 bits to the right of the |
---|
332 | * binary point, and is smoothed with an ALPHA of 0.75. |
---|
333 | */ |
---|
334 | #define TCP_RTT_SCALE 32 /* multiplier for srtt; 3 bits frac. */ |
---|
335 | #define TCP_RTT_SHIFT 5 /* shift for srtt; 3 bits frac. */ |
---|
336 | #define TCP_RTTVAR_SCALE 16 /* multiplier for rttvar; 2 bits */ |
---|
337 | #define TCP_RTTVAR_SHIFT 4 /* shift for rttvar; 2 bits */ |
---|
338 | #define TCP_DELTA_SHIFT 2 /* see tcp_input.c */ |
---|
339 | |
---|
340 | /* |
---|
341 | * The initial retransmission should happen at rtt + 4 * rttvar. |
---|
342 | * Because of the way we do the smoothing, srtt and rttvar |
---|
343 | * will each average +1/2 tick of bias. When we compute |
---|
344 | * the retransmit timer, we want 1/2 tick of rounding and |
---|
345 | * 1 extra tick because of +-1/2 tick uncertainty in the |
---|
346 | * firing of the timer. The bias will give us exactly the |
---|
347 | * 1.5 tick we need. But, because the bias is |
---|
348 | * statistical, we have to test that we don't drop below |
---|
349 | * the minimum feasible timer (which is 2 ticks). |
---|
350 | * This version of the macro adapted from a paper by Lawrence |
---|
351 | * Brakmo and Larry Peterson which outlines a problem caused |
---|
352 | * by insufficient precision in the original implementation, |
---|
353 | * which results in inappropriately large RTO values for very |
---|
354 | * fast networks. |
---|
355 | */ |
---|
356 | #define TCP_REXMTVAL(tp) \ |
---|
357 | max((tp)->t_rttmin, (((tp)->t_srtt >> (TCP_RTT_SHIFT - TCP_DELTA_SHIFT)) \ |
---|
358 | + (tp)->t_rttvar) >> TCP_DELTA_SHIFT) |
---|
359 | |
---|
360 | /* |
---|
361 | * TCP statistics. |
---|
362 | * Many of these should be kept per connection, |
---|
363 | * but that's inconvenient at the moment. |
---|
364 | */ |
---|
365 | struct tcpstat { |
---|
366 | u_long tcps_connattempt; /* connections initiated */ |
---|
367 | u_long tcps_accepts; /* connections accepted */ |
---|
368 | u_long tcps_connects; /* connections established */ |
---|
369 | u_long tcps_drops; /* connections dropped */ |
---|
370 | u_long tcps_conndrops; /* embryonic connections dropped */ |
---|
371 | u_long tcps_minmssdrops; /* average minmss too low drops */ |
---|
372 | u_long tcps_closed; /* conn. closed (includes drops) */ |
---|
373 | u_long tcps_segstimed; /* segs where we tried to get rtt */ |
---|
374 | u_long tcps_rttupdated; /* times we succeeded */ |
---|
375 | u_long tcps_delack; /* delayed acks sent */ |
---|
376 | u_long tcps_timeoutdrop; /* conn. dropped in rxmt timeout */ |
---|
377 | u_long tcps_rexmttimeo; /* retransmit timeouts */ |
---|
378 | u_long tcps_persisttimeo; /* persist timeouts */ |
---|
379 | u_long tcps_keeptimeo; /* keepalive timeouts */ |
---|
380 | u_long tcps_keepprobe; /* keepalive probes sent */ |
---|
381 | u_long tcps_keepdrops; /* connections dropped in keepalive */ |
---|
382 | |
---|
383 | u_long tcps_sndtotal; /* total packets sent */ |
---|
384 | u_long tcps_sndpack; /* data packets sent */ |
---|
385 | u_long tcps_sndbyte; /* data bytes sent */ |
---|
386 | u_long tcps_sndrexmitpack; /* data packets retransmitted */ |
---|
387 | u_long tcps_sndrexmitbyte; /* data bytes retransmitted */ |
---|
388 | u_long tcps_sndrexmitbad; /* unnecessary packet retransmissions */ |
---|
389 | u_long tcps_sndacks; /* ack-only packets sent */ |
---|
390 | u_long tcps_sndprobe; /* window probes sent */ |
---|
391 | u_long tcps_sndurg; /* packets sent with URG only */ |
---|
392 | u_long tcps_sndwinup; /* window update-only packets sent */ |
---|
393 | u_long tcps_sndctrl; /* control (SYN|FIN|RST) packets sent */ |
---|
394 | |
---|
395 | u_long tcps_rcvtotal; /* total packets received */ |
---|
396 | u_long tcps_rcvpack; /* packets received in sequence */ |
---|
397 | u_long tcps_rcvbyte; /* bytes received in sequence */ |
---|
398 | u_long tcps_rcvbadsum; /* packets received with ccksum errs */ |
---|
399 | u_long tcps_rcvbadoff; /* packets received with bad offset */ |
---|
400 | u_long tcps_rcvmemdrop; /* packets dropped for lack of memory */ |
---|
401 | u_long tcps_rcvshort; /* packets received too short */ |
---|
402 | u_long tcps_rcvduppack; /* duplicate-only packets received */ |
---|
403 | u_long tcps_rcvdupbyte; /* duplicate-only bytes received */ |
---|
404 | u_long tcps_rcvpartduppack; /* packets with some duplicate data */ |
---|
405 | u_long tcps_rcvpartdupbyte; /* dup. bytes in part-dup. packets */ |
---|
406 | u_long tcps_rcvoopack; /* out-of-order packets received */ |
---|
407 | u_long tcps_rcvoobyte; /* out-of-order bytes received */ |
---|
408 | u_long tcps_rcvpackafterwin; /* packets with data after window */ |
---|
409 | u_long tcps_rcvbyteafterwin; /* bytes rcvd after window */ |
---|
410 | u_long tcps_rcvafterclose; /* packets rcvd after "close" */ |
---|
411 | u_long tcps_rcvwinprobe; /* rcvd window probe packets */ |
---|
412 | u_long tcps_rcvdupack; /* rcvd duplicate acks */ |
---|
413 | u_long tcps_rcvacktoomuch; /* rcvd acks for unsent data */ |
---|
414 | u_long tcps_rcvackpack; /* rcvd ack packets */ |
---|
415 | u_long tcps_rcvackbyte; /* bytes acked by rcvd acks */ |
---|
416 | u_long tcps_rcvwinupd; /* rcvd window update packets */ |
---|
417 | u_long tcps_pawsdrop; /* segments dropped due to PAWS */ |
---|
418 | u_long tcps_predack; /* times hdr predict ok for acks */ |
---|
419 | u_long tcps_preddat; /* times hdr predict ok for data pkts */ |
---|
420 | u_long tcps_pcbcachemiss; |
---|
421 | u_long tcps_cachedrtt; /* times cached RTT in route updated */ |
---|
422 | u_long tcps_cachedrttvar; /* times cached rttvar updated */ |
---|
423 | u_long tcps_cachedssthresh; /* times cached ssthresh updated */ |
---|
424 | u_long tcps_usedrtt; /* times RTT initialized from route */ |
---|
425 | u_long tcps_usedrttvar; /* times RTTVAR initialized from rt */ |
---|
426 | u_long tcps_usedssthresh; /* times ssthresh initialized from rt*/ |
---|
427 | u_long tcps_persistdrop; /* timeout in persist state */ |
---|
428 | u_long tcps_badsyn; /* bogus SYN, e.g. premature ACK */ |
---|
429 | u_long tcps_mturesent; /* resends due to MTU discovery */ |
---|
430 | u_long tcps_listendrop; /* listen queue overflows */ |
---|
431 | u_long tcps_badrst; /* ignored RSTs in the window */ |
---|
432 | |
---|
433 | u_long tcps_sc_added; /* entry added to syncache */ |
---|
434 | u_long tcps_sc_retransmitted; /* syncache entry was retransmitted */ |
---|
435 | u_long tcps_sc_dupsyn; /* duplicate SYN packet */ |
---|
436 | u_long tcps_sc_dropped; /* could not reply to packet */ |
---|
437 | u_long tcps_sc_completed; /* successful extraction of entry */ |
---|
438 | u_long tcps_sc_bucketoverflow; /* syncache per-bucket limit hit */ |
---|
439 | u_long tcps_sc_cacheoverflow; /* syncache cache limit hit */ |
---|
440 | u_long tcps_sc_reset; /* RST removed entry from syncache */ |
---|
441 | u_long tcps_sc_stale; /* timed out or listen socket gone */ |
---|
442 | u_long tcps_sc_aborted; /* syncache entry aborted */ |
---|
443 | u_long tcps_sc_badack; /* removed due to bad ACK */ |
---|
444 | u_long tcps_sc_unreach; /* ICMP unreachable received */ |
---|
445 | u_long tcps_sc_zonefail; /* zalloc() failed */ |
---|
446 | u_long tcps_sc_sendcookie; /* SYN cookie sent */ |
---|
447 | u_long tcps_sc_recvcookie; /* SYN cookie received */ |
---|
448 | |
---|
449 | u_long tcps_hc_added; /* entry added to hostcache */ |
---|
450 | u_long tcps_hc_bucketoverflow; /* hostcache per bucket limit hit */ |
---|
451 | |
---|
452 | u_long tcps_finwait2_drops; /* Drop FIN_WAIT_2 connection after time limit */ |
---|
453 | |
---|
454 | /* SACK related stats */ |
---|
455 | u_long tcps_sack_recovery_episode; /* SACK recovery episodes */ |
---|
456 | u_long tcps_sack_rexmits; /* SACK rexmit segments */ |
---|
457 | u_long tcps_sack_rexmit_bytes; /* SACK rexmit bytes */ |
---|
458 | u_long tcps_sack_rcv_blocks; /* SACK blocks (options) received */ |
---|
459 | u_long tcps_sack_send_blocks; /* SACK blocks (options) sent */ |
---|
460 | u_long tcps_sack_sboverflow; /* times scoreboard overflowed */ |
---|
461 | |
---|
462 | /* ECN related stats */ |
---|
463 | u_long tcps_ecn_ce; /* ECN Congestion Experienced */ |
---|
464 | u_long tcps_ecn_ect0; /* ECN Capable Transport */ |
---|
465 | u_long tcps_ecn_ect1; /* ECN Capable Transport */ |
---|
466 | u_long tcps_ecn_shs; /* ECN successful handshakes */ |
---|
467 | u_long tcps_ecn_rcwnd; /* # times ECN reduced the cwnd */ |
---|
468 | |
---|
469 | u_long _pad[12]; /* 6 UTO, 6 TBD */ |
---|
470 | }; |
---|
471 | |
---|
472 | #ifdef _KERNEL |
---|
473 | /* |
---|
474 | * In-kernel consumers can use these accessor macros directly to update |
---|
475 | * stats. |
---|
476 | */ |
---|
477 | #define TCPSTAT_ADD(name, val) V_tcpstat.name += (val) |
---|
478 | #define TCPSTAT_INC(name) TCPSTAT_ADD(name, 1) |
---|
479 | |
---|
480 | /* |
---|
481 | * Kernel module consumers must use this accessor macro. |
---|
482 | */ |
---|
483 | void kmod_tcpstat_inc(int statnum); |
---|
484 | #define KMOD_TCPSTAT_INC(name) \ |
---|
485 | kmod_tcpstat_inc(offsetof(struct tcpstat, name) / sizeof(u_long)) |
---|
486 | #endif |
---|
487 | |
---|
488 | /* |
---|
489 | * TCB structure exported to user-land via sysctl(3). |
---|
490 | * Evil hack: declare only if in_pcb.h and sys/socketvar.h have been |
---|
491 | * included. Not all of our clients do. |
---|
492 | */ |
---|
493 | #if defined(_NETINET_IN_PCB_H_) && defined(_SYS_SOCKETVAR_H_) |
---|
494 | struct xtcpcb { |
---|
495 | size_t xt_len; |
---|
496 | struct inpcb xt_inp; |
---|
497 | struct tcpcb xt_tp; |
---|
498 | struct xsocket xt_socket; |
---|
499 | u_quad_t xt_alignment_hack; |
---|
500 | }; |
---|
501 | #endif |
---|
502 | |
---|
503 | /* |
---|
504 | * Names for TCP sysctl objects |
---|
505 | */ |
---|
506 | #define TCPCTL_DO_RFC1323 1 /* use RFC-1323 extensions */ |
---|
507 | #define TCPCTL_MSSDFLT 3 /* MSS default */ |
---|
508 | #define TCPCTL_STATS 4 /* statistics (read-only) */ |
---|
509 | #define TCPCTL_RTTDFLT 5 /* default RTT estimate */ |
---|
510 | #define TCPCTL_KEEPIDLE 6 /* keepalive idle timer */ |
---|
511 | #define TCPCTL_KEEPINTVL 7 /* interval to send keepalives */ |
---|
512 | #define TCPCTL_SENDSPACE 8 /* send buffer space */ |
---|
513 | #define TCPCTL_RECVSPACE 9 /* receive buffer space */ |
---|
514 | #define TCPCTL_KEEPINIT 10 /* timeout for establishing syn */ |
---|
515 | #define TCPCTL_PCBLIST 11 /* list of all outstanding PCBs */ |
---|
516 | #define TCPCTL_DELACKTIME 12 /* time before sending delayed ACK */ |
---|
517 | #define TCPCTL_V6MSSDFLT 13 /* MSS default for IPv6 */ |
---|
518 | #define TCPCTL_SACK 14 /* Selective Acknowledgement,rfc 2018 */ |
---|
519 | #define TCPCTL_DROP 15 /* drop tcp connection */ |
---|
520 | #define TCPCTL_MAXID 16 |
---|
521 | #define TCPCTL_FINWAIT2_TIMEOUT 17 |
---|
522 | |
---|
523 | #define TCPCTL_NAMES { \ |
---|
524 | { 0, 0 }, \ |
---|
525 | { "rfc1323", CTLTYPE_INT }, \ |
---|
526 | { "mssdflt", CTLTYPE_INT }, \ |
---|
527 | { "stats", CTLTYPE_STRUCT }, \ |
---|
528 | { "rttdflt", CTLTYPE_INT }, \ |
---|
529 | { "keepidle", CTLTYPE_INT }, \ |
---|
530 | { "keepintvl", CTLTYPE_INT }, \ |
---|
531 | { "sendspace", CTLTYPE_INT }, \ |
---|
532 | { "recvspace", CTLTYPE_INT }, \ |
---|
533 | { "keepinit", CTLTYPE_INT }, \ |
---|
534 | { "pcblist", CTLTYPE_STRUCT }, \ |
---|
535 | { "delacktime", CTLTYPE_INT }, \ |
---|
536 | { "v6mssdflt", CTLTYPE_INT }, \ |
---|
537 | { "maxid", CTLTYPE_INT }, \ |
---|
538 | } |
---|
539 | |
---|
540 | |
---|
541 | #ifdef _KERNEL |
---|
542 | #ifdef SYSCTL_DECL |
---|
543 | SYSCTL_DECL(_net_inet_tcp); |
---|
544 | SYSCTL_DECL(_net_inet_tcp_sack); |
---|
545 | MALLOC_DECLARE(M_TCPLOG); |
---|
546 | #endif |
---|
547 | |
---|
548 | VNET_DECLARE(struct inpcbhead, tcb); /* queue of active tcpcb's */ |
---|
549 | VNET_DECLARE(struct inpcbinfo, tcbinfo); |
---|
550 | VNET_DECLARE(struct tcpstat, tcpstat); /* tcp statistics */ |
---|
551 | extern int tcp_log_in_vain; |
---|
552 | VNET_DECLARE(int, tcp_mssdflt); /* XXX */ |
---|
553 | VNET_DECLARE(int, tcp_minmss); |
---|
554 | VNET_DECLARE(int, tcp_delack_enabled); |
---|
555 | VNET_DECLARE(int, tcp_do_rfc3390); |
---|
556 | VNET_DECLARE(int, tcp_do_newreno); |
---|
557 | VNET_DECLARE(int, path_mtu_discovery); |
---|
558 | VNET_DECLARE(int, ss_fltsz); |
---|
559 | VNET_DECLARE(int, ss_fltsz_local); |
---|
560 | #define V_tcb VNET(tcb) |
---|
561 | #define V_tcbinfo VNET(tcbinfo) |
---|
562 | #define V_tcpstat VNET(tcpstat) |
---|
563 | #define V_tcp_mssdflt VNET(tcp_mssdflt) |
---|
564 | #define V_tcp_minmss VNET(tcp_minmss) |
---|
565 | #define V_tcp_delack_enabled VNET(tcp_delack_enabled) |
---|
566 | #define V_tcp_do_rfc3390 VNET(tcp_do_rfc3390) |
---|
567 | #define V_tcp_do_newreno VNET(tcp_do_newreno) |
---|
568 | #define V_path_mtu_discovery VNET(path_mtu_discovery) |
---|
569 | #define V_ss_fltsz VNET(ss_fltsz) |
---|
570 | #define V_ss_fltsz_local VNET(ss_fltsz_local) |
---|
571 | |
---|
572 | VNET_DECLARE(int, tcp_do_sack); /* SACK enabled/disabled */ |
---|
573 | VNET_DECLARE(int, tcp_sc_rst_sock_fail); /* RST on sock alloc failure */ |
---|
574 | #define V_tcp_do_sack VNET(tcp_do_sack) |
---|
575 | #define V_tcp_sc_rst_sock_fail VNET(tcp_sc_rst_sock_fail) |
---|
576 | |
---|
577 | VNET_DECLARE(int, tcp_do_ecn); /* TCP ECN enabled/disabled */ |
---|
578 | VNET_DECLARE(int, tcp_ecn_maxretries); |
---|
579 | #define V_tcp_do_ecn VNET(tcp_do_ecn) |
---|
580 | #define V_tcp_ecn_maxretries VNET(tcp_ecn_maxretries) |
---|
581 | |
---|
582 | int tcp_addoptions(struct tcpopt *, u_char *); |
---|
583 | struct tcpcb * |
---|
584 | tcp_close(struct tcpcb *); |
---|
585 | void tcp_discardcb(struct tcpcb *); |
---|
586 | void tcp_twstart(struct tcpcb *); |
---|
587 | #if 0 |
---|
588 | int tcp_twrecycleable(struct tcptw *tw); |
---|
589 | #endif |
---|
590 | void tcp_twclose(struct tcptw *_tw, int _reuse); |
---|
591 | void tcp_ctlinput(int, struct sockaddr *, void *); |
---|
592 | int tcp_ctloutput(struct socket *, struct sockopt *); |
---|
593 | struct tcpcb * |
---|
594 | tcp_drop(struct tcpcb *, int); |
---|
595 | void tcp_drain(void); |
---|
596 | void tcp_init(void); |
---|
597 | #ifdef VIMAGE |
---|
598 | void tcp_destroy(void); |
---|
599 | #endif |
---|
600 | void tcp_fini(void *); |
---|
601 | char *tcp_log_addrs(struct in_conninfo *, struct tcphdr *, void *, |
---|
602 | const void *); |
---|
603 | char *tcp_log_vain(struct in_conninfo *, struct tcphdr *, void *, |
---|
604 | const void *); |
---|
605 | int tcp_reass(struct tcpcb *, struct tcphdr *, int *, struct mbuf *); |
---|
606 | void tcp_reass_init(void); |
---|
607 | void tcp_reass_flush(struct tcpcb *); |
---|
608 | #ifdef VIMAGE |
---|
609 | void tcp_reass_destroy(void); |
---|
610 | #endif |
---|
611 | void tcp_input(struct mbuf *, int); |
---|
612 | u_long tcp_maxmtu(struct in_conninfo *, int *); |
---|
613 | u_long tcp_maxmtu6(struct in_conninfo *, int *); |
---|
614 | void tcp_mss_update(struct tcpcb *, int, struct hc_metrics_lite *, int *); |
---|
615 | void tcp_mss(struct tcpcb *, int); |
---|
616 | int tcp_mssopt(struct in_conninfo *); |
---|
617 | struct inpcb * |
---|
618 | tcp_drop_syn_sent(struct inpcb *, int); |
---|
619 | struct inpcb * |
---|
620 | tcp_mtudisc(struct inpcb *, int); |
---|
621 | struct tcpcb * |
---|
622 | tcp_newtcpcb(struct inpcb *); |
---|
623 | int tcp_output(struct tcpcb *); |
---|
624 | void tcp_respond(struct tcpcb *, void *, |
---|
625 | struct tcphdr *, struct mbuf *, tcp_seq, tcp_seq, int); |
---|
626 | void tcp_tw_init(void); |
---|
627 | #ifdef VIMAGE |
---|
628 | void tcp_tw_destroy(void); |
---|
629 | #endif |
---|
630 | void tcp_tw_zone_change(void); |
---|
631 | int tcp_twcheck(struct inpcb *, struct tcpopt *, struct tcphdr *, |
---|
632 | struct mbuf *, int); |
---|
633 | int tcp_twrespond(struct tcptw *, int); |
---|
634 | void tcp_setpersist(struct tcpcb *); |
---|
635 | #ifdef TCP_SIGNATURE |
---|
636 | int tcp_signature_compute(struct mbuf *, int, int, int, u_char *, u_int); |
---|
637 | #endif |
---|
638 | void tcp_slowtimo(void); |
---|
639 | struct tcptemp * |
---|
640 | tcpip_maketemplate(struct inpcb *); |
---|
641 | void tcpip_fillheaders(struct inpcb *, void *, void *); |
---|
642 | void tcp_timer_activate(struct tcpcb *, int, u_int); |
---|
643 | int tcp_timer_active(struct tcpcb *, int); |
---|
644 | void tcp_trace(short, short, struct tcpcb *, void *, struct tcphdr *, int); |
---|
645 | void tcp_xmit_bandwidth_limit(struct tcpcb *tp, tcp_seq ack_seq); |
---|
646 | /* |
---|
647 | * All tcp_hc_* functions are IPv4 and IPv6 (via in_conninfo) |
---|
648 | */ |
---|
649 | void tcp_hc_init(void); |
---|
650 | #ifdef VIMAGE |
---|
651 | void tcp_hc_destroy(void); |
---|
652 | #endif |
---|
653 | void tcp_hc_get(struct in_conninfo *, struct hc_metrics_lite *); |
---|
654 | u_long tcp_hc_getmtu(struct in_conninfo *); |
---|
655 | void tcp_hc_updatemtu(struct in_conninfo *, u_long); |
---|
656 | void tcp_hc_update(struct in_conninfo *, struct hc_metrics_lite *); |
---|
657 | |
---|
658 | extern struct pr_usrreqs tcp_usrreqs; |
---|
659 | extern u_long tcp_sendspace; |
---|
660 | extern u_long tcp_recvspace; |
---|
661 | tcp_seq tcp_new_isn(struct tcpcb *); |
---|
662 | |
---|
663 | void tcp_sack_doack(struct tcpcb *, struct tcpopt *, tcp_seq); |
---|
664 | void tcp_update_sack_list(struct tcpcb *tp, tcp_seq rcv_laststart, tcp_seq rcv_lastend); |
---|
665 | void tcp_clean_sackreport(struct tcpcb *tp); |
---|
666 | void tcp_sack_adjust(struct tcpcb *tp); |
---|
667 | struct sackhole *tcp_sack_output(struct tcpcb *tp, int *sack_bytes_rexmt); |
---|
668 | void tcp_sack_partialack(struct tcpcb *, struct tcphdr *); |
---|
669 | void tcp_free_sackholes(struct tcpcb *tp); |
---|
670 | int tcp_newreno(struct tcpcb *, struct tcphdr *); |
---|
671 | u_long tcp_seq_subtract(u_long, u_long ); |
---|
672 | |
---|
673 | #endif /* _KERNEL */ |
---|
674 | |
---|
675 | #endif /* _NETINET_TCP_VAR_H_ */ |
---|