This source file includes following definitions.
- tcp_reass_lock_try
- tcp_reass_unlock
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #ifndef _NETINET_TCP_VAR_H_
36 #define _NETINET_TCP_VAR_H_
37
38
39
40
41
42 struct sackblk {
43 tcp_seq start;
44 tcp_seq end;
45 };
46
47 struct sackhole {
48 tcp_seq start;
49 tcp_seq end;
50 int dups;
51 tcp_seq rxmit;
52 struct sackhole *next;
53 };
54
55
56
57
58 TAILQ_HEAD(tcpqehead, tcpqent);
59 struct tcpqent {
60 TAILQ_ENTRY(tcpqent) tcpqe_q;
61 struct tcphdr *tcpqe_tcp;
62 struct mbuf *tcpqe_m;
63 };
64
65
66
67
68 struct tcpcb {
69 struct tcpqehead t_segq;
70 struct timeout t_timer[TCPT_NTIMERS];
71 short t_state;
72 short t_rxtshift;
73 short t_rxtcur;
74 short t_dupacks;
75 u_short t_maxseg;
76 char t_force;
77 u_int t_flags;
78 #define TF_ACKNOW 0x0001
79 #define TF_DELACK 0x0002
80 #define TF_NODELAY 0x0004
81 #define TF_NOOPT 0x0008
82 #define TF_SENTFIN 0x0010
83 #define TF_REQ_SCALE 0x0020
84 #define TF_RCVD_SCALE 0x0040
85 #define TF_REQ_TSTMP 0x0080
86 #define TF_RCVD_TSTMP 0x0100
87 #define TF_SACK_PERMIT 0x0200
88 #define TF_SIGNATURE 0x0400
89 #ifdef TCP_ECN
90 #define TF_ECN_PERMIT 0x00008000
91 #define TF_RCVD_CE 0x00010000
92 #define TF_SEND_CWR 0x00020000
93 #define TF_DISABLE_ECN 0x00040000
94 #endif
95 #define TF_REASSLOCK 0x00080000
96 #define TF_LASTIDLE 0x00100000
97 #define TF_DEAD 0x00200000
98 #define TF_PMTUD_PEND 0x00400000
99
100 struct mbuf *t_template;
101 struct inpcb *t_inpcb;
102 struct timeout t_delack_to;
103
104
105
106
107
108 tcp_seq snd_una;
109 tcp_seq snd_nxt;
110 tcp_seq snd_up;
111 tcp_seq snd_wl1;
112 tcp_seq snd_wl2;
113 tcp_seq iss;
114 u_long snd_wnd;
115 #if 1
116 int sack_enable;
117 int snd_numholes;
118 struct sackhole *snd_holes;
119 #if 1
120 tcp_seq snd_fack;
121 u_long snd_awnd;
122
123 int retran_data;
124 #endif
125 #endif
126 #if 1
127 tcp_seq snd_last;
128 #endif
129
130 u_long rcv_wnd;
131 tcp_seq rcv_nxt;
132 tcp_seq rcv_up;
133 tcp_seq irs;
134 #if 1
135 tcp_seq rcv_lastsack;
136 int rcv_numsacks;
137 struct sackblk sackblks[MAX_SACK_BLKS];
138 #endif
139
140
141
142
143
144 tcp_seq rcv_adv;
145
146 tcp_seq snd_max;
147
148
149
150 u_long snd_cwnd;
151 u_long snd_ssthresh;
152
153
154
155 u_short t_maxopd;
156 u_short t_peermss;
157
158
159
160
161
162 uint32_t t_rcvtime;
163 uint32_t t_rtttime;
164 tcp_seq t_rtseq;
165 short t_srtt;
166 short t_rttvar;
167 u_short t_rttmin;
168 u_long max_sndwnd;
169
170
171 char t_oobflags;
172 char t_iobc;
173 #define TCPOOB_HAVEDATA 0x01
174 #define TCPOOB_HADDATA 0x02
175 short t_softerror;
176
177
178 u_char snd_scale;
179 u_char rcv_scale;
180 u_char request_r_scale;
181 u_char requested_s_scale;
182 u_int32_t ts_recent;
183 u_int32_t ts_modulate;
184 u_int32_t ts_recent_age;
185 tcp_seq last_ack_sent;
186
187
188 LIST_HEAD(, syn_cache) t_sc;
189
190
191 u_int t_pmtud_mss_acked;
192 u_int t_pmtud_mtu_sent;
193 tcp_seq t_pmtud_th_seq;
194 u_int t_pmtud_nextmtu;
195 u_short t_pmtud_ip_len;
196 u_short t_pmtud_ip_hl;
197
198 int pf;
199
200 struct timeout t_reap_to;
201 };
202
203 #define intotcpcb(ip) ((struct tcpcb *)(ip)->inp_ppcb)
204 #define sototcpcb(so) (intotcpcb(sotoinpcb(so)))
205
206 #ifdef _KERNEL
207 extern int tcp_delack_ticks;
208 void tcp_delack(void *);
209
210 #define TCP_INIT_DELACK(tp) \
211 timeout_set(&(tp)->t_delack_to, tcp_delack, tp)
212
213 #define TCP_RESTART_DELACK(tp) \
214 timeout_add(&(tp)->t_delack_to, tcp_delack_ticks)
215
216 #define TCP_SET_DELACK(tp) \
217 do { \
218 if (((tp)->t_flags & TF_DELACK) == 0) { \
219 (tp)->t_flags |= TF_DELACK; \
220 TCP_RESTART_DELACK(tp); \
221 } \
222 } while (0)
223
224 #define TCP_CLEAR_DELACK(tp) \
225 do { \
226 if ((tp)->t_flags & TF_DELACK) { \
227 (tp)->t_flags &= ~TF_DELACK; \
228 timeout_del(&(tp)->t_delack_to); \
229 } \
230 } while (0)
231
232
233
234
235 struct tcp_opt_info {
236 int ts_present;
237 u_int32_t ts_val;
238 u_int32_t ts_ecr;
239 u_int16_t maxseg;
240 };
241
242
243
244
245 union syn_cache_sa {
246 struct sockaddr sa;
247 struct sockaddr_in sin;
248 #if 1
249 struct sockaddr_in6 sin6;
250 #endif
251 };
252
253 struct syn_cache {
254 TAILQ_ENTRY(syn_cache) sc_bucketq;
255 struct timeout sc_timer;
256 union {
257 struct route route4;
258 #ifdef INET6
259 struct route_in6 route6;
260 #endif
261 } sc_route_u;
262 #define sc_route4 sc_route_u.route4
263 #ifdef INET6
264 #define sc_route6 sc_route_u.route6
265 #endif
266 long sc_win;
267 int sc_bucketidx;
268 u_int32_t sc_hash;
269 u_int32_t sc_timestamp;
270 u_int32_t sc_modulate;
271 #if 0
272 u_int32_t sc_timebase;
273 #endif
274 union syn_cache_sa sc_src;
275 union syn_cache_sa sc_dst;
276 tcp_seq sc_irs;
277 tcp_seq sc_iss;
278 u_int sc_rxtcur;
279 u_int sc_rxttot;
280 u_short sc_rxtshift;
281 u_short sc_flags;
282
283 #define SCF_UNREACH 0x0001
284 #define SCF_TIMESTAMP 0x0002
285 #define SCF_DEAD 0x0004
286 #define SCF_SACK_PERMIT 0x0008
287 #define SCF_ECN_PERMIT 0x0010
288 #define SCF_SIGNATURE 0x0020
289
290 struct mbuf *sc_ipopts;
291 u_int16_t sc_peermaxseg;
292 u_int16_t sc_ourmaxseg;
293 u_int sc_request_r_scale : 4,
294 sc_requested_s_scale : 4;
295
296 struct tcpcb *sc_tp;
297 LIST_ENTRY(syn_cache) sc_tpq;
298 };
299
300 struct syn_cache_head {
301 TAILQ_HEAD(, syn_cache) sch_bucket;
302 u_short sch_length;
303 };
304
305 static __inline int tcp_reass_lock_try(struct tcpcb *);
306 static __inline void tcp_reass_unlock(struct tcpcb *);
307 #define tcp_reass_lock(tp) tcp_reass_lock_try(tp)
308
309 static __inline int
310 tcp_reass_lock_try(struct tcpcb *tp)
311 {
312 int s;
313
314
315 s = splvm();
316 if (tp->t_flags & TF_REASSLOCK) {
317 splx(s);
318 return (0);
319 }
320 tp->t_flags |= TF_REASSLOCK;
321 splx(s);
322 return (1);
323 }
324
325 static __inline void
326 tcp_reass_unlock(struct tcpcb *tp)
327 {
328 int s;
329
330 s = splvm();
331 tp->t_flags &= ~TF_REASSLOCK;
332 splx(s);
333 }
334 #endif
335
336
337
338
339
340
341
342
343
344
345 #define TCP_RTT_SHIFT 3
346 #define TCP_RTTVAR_SHIFT 2
347 #define TCP_RTT_BASE_SHIFT 2
348 #define TCP_RTT_MAX (1<<9)
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363 #define TCP_REXMTVAL(tp) \
364 ((((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) >> TCP_RTT_BASE_SHIFT)
365
366
367
368
369
370
371 struct tcpstat {
372 u_int32_t tcps_connattempt;
373 u_int32_t tcps_accepts;
374 u_int32_t tcps_connects;
375 u_int32_t tcps_drops;
376 u_int32_t tcps_conndrops;
377 u_int32_t tcps_closed;
378 u_int32_t tcps_segstimed;
379 u_int32_t tcps_rttupdated;
380 u_int32_t tcps_delack;
381 u_int32_t tcps_timeoutdrop;
382 u_int32_t tcps_rexmttimeo;
383 u_int32_t tcps_persisttimeo;
384 u_int32_t tcps_persistdrop;
385 u_int32_t tcps_keeptimeo;
386 u_int32_t tcps_keepprobe;
387 u_int32_t tcps_keepdrops;
388
389 u_int32_t tcps_sndtotal;
390 u_int32_t tcps_sndpack;
391 u_int64_t tcps_sndbyte;
392 u_int32_t tcps_sndrexmitpack;
393 u_int64_t tcps_sndrexmitbyte;
394 u_int64_t tcps_sndrexmitfast;
395 u_int32_t tcps_sndacks;
396 u_int32_t tcps_sndprobe;
397 u_int32_t tcps_sndurg;
398 u_int32_t tcps_sndwinup;
399 u_int32_t tcps_sndctrl;
400
401 u_int32_t tcps_rcvtotal;
402 u_int32_t tcps_rcvpack;
403 u_int64_t tcps_rcvbyte;
404 u_int32_t tcps_rcvbadsum;
405 u_int32_t tcps_rcvbadoff;
406 u_int32_t tcps_rcvmemdrop;
407 u_int32_t tcps_rcvnosec;
408 u_int32_t tcps_rcvshort;
409 u_int32_t tcps_rcvduppack;
410 u_int64_t tcps_rcvdupbyte;
411 u_int32_t tcps_rcvpartduppack;
412 u_int64_t tcps_rcvpartdupbyte;
413 u_int32_t tcps_rcvoopack;
414 u_int64_t tcps_rcvoobyte;
415 u_int32_t tcps_rcvpackafterwin;
416 u_int64_t tcps_rcvbyteafterwin;
417 u_int32_t tcps_rcvafterclose;
418 u_int32_t tcps_rcvwinprobe;
419 u_int32_t tcps_rcvdupack;
420 u_int32_t tcps_rcvacktoomuch;
421 u_int32_t tcps_rcvacktooold;
422 u_int32_t tcps_rcvackpack;
423 u_int64_t tcps_rcvackbyte;
424 u_int32_t tcps_rcvwinupd;
425 u_int32_t tcps_pawsdrop;
426 u_int32_t tcps_predack;
427 u_int32_t tcps_preddat;
428
429 u_int32_t tcps_pcbhashmiss;
430 u_int32_t tcps_noport;
431 u_int32_t tcps_badsyn;
432
433 u_int32_t tcps_rcvbadsig;
434 u_int64_t tcps_rcvgoodsig;
435 u_int32_t tcps_inhwcsum;
436 u_int32_t tcps_outhwcsum;
437
438
439 u_int32_t tcps_ecn_accepts;
440 u_int32_t tcps_ecn_rcvece;
441 u_int32_t tcps_ecn_rcvcwr;
442 u_int32_t tcps_ecn_rcvce;
443 u_int32_t tcps_ecn_sndect;
444 u_int32_t tcps_ecn_sndece;
445 u_int32_t tcps_ecn_sndcwr;
446 u_int32_t tcps_cwr_ecn;
447 u_int32_t tcps_cwr_frecovery;
448 u_int32_t tcps_cwr_timeout;
449
450
451 u_int64_t tcps_sc_added;
452 u_int64_t tcps_sc_completed;
453 u_int64_t tcps_sc_timed_out;
454 u_int64_t tcps_sc_overflowed;
455 u_int64_t tcps_sc_reset;
456 u_int64_t tcps_sc_unreach;
457 u_int64_t tcps_sc_bucketoverflow;
458 u_int64_t tcps_sc_aborted;
459 u_int64_t tcps_sc_dupesyn;
460 u_int64_t tcps_sc_dropped;
461 u_int64_t tcps_sc_collisions;
462 u_int64_t tcps_sc_retransmitted;
463
464 u_int64_t tcps_conndrained;
465
466 u_int64_t tcps_sack_recovery_episode;
467 u_int64_t tcps_sack_rexmits;
468 u_int64_t tcps_sack_rexmit_bytes;
469 u_int64_t tcps_sack_rcv_opts;
470 u_int64_t tcps_sack_snd_opts;
471 };
472
473
474
475
476
477 #define TCPCTL_RFC1323 1
478 #define TCPCTL_KEEPINITTIME 2
479 #define TCPCTL_KEEPIDLE 3
480 #define TCPCTL_KEEPINTVL 4
481 #define TCPCTL_SLOWHZ 5
482 #define TCPCTL_BADDYNAMIC 6
483 #define TCPCTL_RECVSPACE 7
484 #define TCPCTL_SENDSPACE 8
485 #define TCPCTL_IDENT 9
486 #define TCPCTL_SACK 10
487 #define TCPCTL_MSSDFLT 11
488 #define TCPCTL_RSTPPSLIMIT 12
489 #define TCPCTL_ACK_ON_PUSH 13
490 #define TCPCTL_ECN 14
491 #define TCPCTL_SYN_CACHE_LIMIT 15
492 #define TCPCTL_SYN_BUCKET_LIMIT 16
493 #define TCPCTL_RFC3390 17
494 #define TCPCTL_REASS_LIMIT 18
495 #define TCPCTL_DROP 19
496 #define TCPCTL_SACKHOLE_LIMIT 20
497 #define TCPCTL_MAXID 21
498
499 #define TCPCTL_NAMES { \
500 { 0, 0 }, \
501 { "rfc1323", CTLTYPE_INT }, \
502 { "keepinittime", CTLTYPE_INT }, \
503 { "keepidle", CTLTYPE_INT }, \
504 { "keepintvl", CTLTYPE_INT }, \
505 { "slowhz", CTLTYPE_INT }, \
506 { "baddynamic", CTLTYPE_STRUCT }, \
507 { "recvspace", CTLTYPE_INT }, \
508 { "sendspace", CTLTYPE_INT }, \
509 { "ident", CTLTYPE_STRUCT }, \
510 { "sack", CTLTYPE_INT }, \
511 { "mssdflt", CTLTYPE_INT }, \
512 { "rstppslimit", CTLTYPE_INT }, \
513 { "ackonpush", CTLTYPE_INT }, \
514 { "ecn", CTLTYPE_INT }, \
515 { "syncachelimit", CTLTYPE_INT }, \
516 { "synbucketlimit", CTLTYPE_INT }, \
517 { "rfc3390", CTLTYPE_INT }, \
518 { "reasslimit", CTLTYPE_INT }, \
519 { "drop", CTLTYPE_STRUCT }, \
520 { "sackholelimit", CTLTYPE_INT }, \
521 }
522
523 #define TCPCTL_VARS { \
524 NULL, \
525 &tcp_do_rfc1323, \
526 &tcptv_keep_init, \
527 &tcp_keepidle, \
528 &tcp_keepintvl, \
529 NULL, \
530 NULL, \
531 &tcp_recvspace, \
532 &tcp_sendspace, \
533 NULL, \
534 NULL, \
535 &tcp_mssdflt, \
536 &tcp_rst_ppslim, \
537 &tcp_ack_on_push, \
538 NULL, \
539 &tcp_syn_cache_limit, \
540 &tcp_syn_bucket_limit, \
541 &tcp_do_rfc3390, \
542 NULL, \
543 NULL, \
544 NULL \
545 }
546
547 struct tcp_ident_mapping {
548 struct sockaddr_storage faddr, laddr;
549 int euid, ruid;
550 };
551
552 #ifdef _KERNEL
553 extern struct inpcbtable tcbtable;
554 extern struct tcpstat tcpstat;
555 extern u_int32_t tcp_now;
556 extern int tcp_do_rfc1323;
557 extern int tcp_mssdflt;
558 extern int tcp_ack_on_push;
559 #ifdef TCP_SACK
560 extern int tcp_do_sack;
561 extern struct pool sackhl_pool;
562 extern int tcp_sackhole_limit;
563 #endif
564 extern int tcp_do_ecn;
565 extern int tcp_do_rfc3390;
566
567 extern struct pool tcpqe_pool;
568 extern int tcp_reass_limit;
569
570 extern int tcp_syn_cache_limit;
571 extern int tcp_syn_bucket_limit;
572
573 extern int tcp_syn_cache_size;
574 extern struct syn_cache_head tcp_syn_cache[];
575 extern u_long syn_cache_count;
576
577 int tcp_attach(struct socket *);
578 void tcp_canceltimers(struct tcpcb *);
579 struct tcpcb *
580 tcp_close(struct tcpcb *);
581 void tcp_reaper(void *);
582 int tcp_freeq(struct tcpcb *);
583 #if defined(INET6) && !defined(TCP6)
584 void tcp6_ctlinput(int, struct sockaddr *, void *);
585 #endif
586 void *tcp_ctlinput(int, struct sockaddr *, void *);
587 int tcp_ctloutput(int, struct socket *, int, int, struct mbuf **);
588 struct tcpcb *
589 tcp_disconnect(struct tcpcb *);
590 struct tcpcb *
591 tcp_drop(struct tcpcb *, int);
592 int tcp_dooptions(struct tcpcb *, u_char *, int, struct tcphdr *,
593 struct mbuf *, int, struct tcp_opt_info *);
594 void tcp_drain(void);
595 void tcp_init(void);
596 #if defined(INET6) && !defined(TCP6)
597 int tcp6_input(struct mbuf **, int *, int);
598 #endif
599 void tcp_input(struct mbuf *, ...);
600 int tcp_mss(struct tcpcb *, int);
601 void tcp_mss_update(struct tcpcb *);
602 u_int tcp_hdrsz(struct tcpcb *);
603 void tcp_mtudisc(struct inpcb *, int);
604 void tcp_mtudisc_increase(struct inpcb *, int);
605 #ifdef INET6
606 void tcp6_mtudisc(struct inpcb *, int);
607 void tcp6_mtudisc_callback(struct in6_addr *);
608 #endif
609 struct tcpcb *
610 tcp_newtcpcb(struct inpcb *);
611 void tcp_notify(struct inpcb *, int);
612 int tcp_output(struct tcpcb *);
613 void tcp_pulloutofband(struct socket *, u_int, struct mbuf *, int);
614 int tcp_reass(struct tcpcb *, struct tcphdr *, struct mbuf *, int *);
615 void tcp_rscale(struct tcpcb *, u_long);
616 void tcp_respond(struct tcpcb *, caddr_t, struct mbuf *, tcp_seq,
617 tcp_seq, int);
618 void tcp_setpersist(struct tcpcb *);
619 void tcp_slowtimo(void);
620 struct mbuf *
621 tcp_template(struct tcpcb *);
622 void tcp_trace(short, short, struct tcpcb *, caddr_t, int, int);
623 struct tcpcb *
624 tcp_usrclosed(struct tcpcb *);
625 int tcp_sysctl(int *, u_int, void *, size_t *, void *, size_t);
626 #if defined(INET6) && !defined(TCP6)
627 int tcp6_usrreq(struct socket *,
628 int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *);
629 #endif
630 int tcp_usrreq(struct socket *,
631 int, struct mbuf *, struct mbuf *, struct mbuf *);
632 void tcp_xmit_timer(struct tcpcb *, int);
633 void tcpdropoldhalfopen(struct tcpcb *, u_int16_t);
634 #ifdef TCP_SACK
635 void tcp_sack_option(struct tcpcb *,struct tcphdr *,u_char *,int);
636 void tcp_update_sack_list(struct tcpcb *tp, tcp_seq, tcp_seq);
637 void tcp_del_sackholes(struct tcpcb *, struct tcphdr *);
638 void tcp_clean_sackreport(struct tcpcb *tp);
639 void tcp_sack_adjust(struct tcpcb *tp);
640 struct sackhole *
641 tcp_sack_output(struct tcpcb *tp);
642 int tcp_sack_partialack(struct tcpcb *, struct tcphdr *);
643 #ifdef DEBUG
644 void tcp_print_holes(struct tcpcb *tp);
645 #endif
646 #endif
647 #if defined(TCP_SACK)
648 int tcp_newreno(struct tcpcb *, struct tcphdr *);
649 u_long tcp_seq_subtract(u_long, u_long );
650 #endif
651 #ifdef TCP_SIGNATURE
652 int tcp_signature_apply(caddr_t, caddr_t, unsigned int);
653 int tcp_signature(struct tdb *, int, struct mbuf *, struct tcphdr *,
654 int, int, char *);
655 #endif
656 void tcp_rndiss_init(void);
657 tcp_seq tcp_rndiss_next(void);
658 u_int16_t
659 tcp_rndiss_encrypt(u_int16_t);
660 void tcp_set_iss_tsm(struct tcpcb *);
661
662 int syn_cache_add(struct sockaddr *, struct sockaddr *,
663 struct tcphdr *, unsigned int, struct socket *,
664 struct mbuf *, u_char *, int, struct tcp_opt_info *, tcp_seq *);
665 void syn_cache_unreach(struct sockaddr *, struct sockaddr *,
666 struct tcphdr *);
667 struct socket *syn_cache_get(struct sockaddr *, struct sockaddr *,
668 struct tcphdr *, unsigned int, unsigned int,
669 struct socket *so, struct mbuf *);
670 void syn_cache_init(void);
671 void syn_cache_insert(struct syn_cache *, struct tcpcb *);
672 struct syn_cache *syn_cache_lookup(struct sockaddr *, struct sockaddr *,
673 struct syn_cache_head **);
674 void syn_cache_reset(struct sockaddr *, struct sockaddr *,
675 struct tcphdr *);
676 int syn_cache_respond(struct syn_cache *, struct mbuf *);
677 void syn_cache_timer(void *);
678 void syn_cache_cleanup(struct tcpcb *);
679 void syn_cache_reaper(void *);
680
681 #endif
682 #endif