Split out wildcarded sockets from the connection hash table.
[dragonfly.git] / sys / netinet / tcp_subr.c
1 /*
2  * Copyright (c) 1982, 1986, 1988, 1990, 1993, 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  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  *      @(#)tcp_subr.c  8.2 (Berkeley) 5/24/95
34  * $FreeBSD: src/sys/netinet/tcp_subr.c,v 1.73.2.31 2003/01/24 05:11:34 sam Exp $
35  * $DragonFly: src/sys/netinet/tcp_subr.c,v 1.12 2004/03/04 01:02:05 hsu Exp $
36  */
37
38 #include "opt_compat.h"
39 #include "opt_inet6.h"
40 #include "opt_ipsec.h"
41 #include "opt_tcpdebug.h"
42
43 #include <sys/param.h>
44 #include <sys/systm.h>
45 #include <sys/callout.h>
46 #include <sys/kernel.h>
47 #include <sys/sysctl.h>
48 #include <sys/malloc.h>
49 #include <sys/mbuf.h>
50 #ifdef INET6
51 #include <sys/domain.h>
52 #endif
53 #include <sys/proc.h>
54 #include <sys/socket.h>
55 #include <sys/socketvar.h>
56 #include <sys/protosw.h>
57 #include <sys/random.h>
58 #include <sys/in_cksum.h>
59
60 #include <vm/vm_zone.h>
61
62 #include <net/route.h>
63 #include <net/if.h>
64
65 #define _IP_VHL
66 #include <netinet/in.h>
67 #include <netinet/in_systm.h>
68 #include <netinet/ip.h>
69 #ifdef INET6
70 #include <netinet/ip6.h>
71 #endif
72 #include <netinet/in_pcb.h>
73 #ifdef INET6
74 #include <netinet6/in6_pcb.h>
75 #endif
76 #include <netinet/in_var.h>
77 #include <netinet/ip_var.h>
78 #ifdef INET6
79 #include <netinet6/ip6_var.h>
80 #endif
81 #include <netinet/tcp.h>
82 #include <netinet/tcp_fsm.h>
83 #include <netinet/tcp_seq.h>
84 #include <netinet/tcp_timer.h>
85 #include <netinet/tcp_var.h>
86 #ifdef INET6
87 #include <netinet6/tcp6_var.h>
88 #endif
89 #include <netinet/tcpip.h>
90 #ifdef TCPDEBUG
91 #include <netinet/tcp_debug.h>
92 #endif
93 #include <netinet6/ip6protosw.h>
94
95 #ifdef IPSEC
96 #include <netinet6/ipsec.h>
97 #ifdef INET6
98 #include <netinet6/ipsec6.h>
99 #endif
100 #endif /*IPSEC*/
101
102 #ifdef FAST_IPSEC
103 #include <netipsec/ipsec.h>
104 #ifdef INET6
105 #include <netipsec/ipsec6.h>
106 #endif
107 #define IPSEC
108 #endif /*FAST_IPSEC*/
109
110 #include <sys/md5.h>
111
112 int     tcp_mssdflt = TCP_MSS;
113 SYSCTL_INT(_net_inet_tcp, TCPCTL_MSSDFLT, mssdflt, CTLFLAG_RW, 
114     &tcp_mssdflt , 0, "Default TCP Maximum Segment Size");
115
116 #ifdef INET6
117 int     tcp_v6mssdflt = TCP6_MSS;
118 SYSCTL_INT(_net_inet_tcp, TCPCTL_V6MSSDFLT, v6mssdflt,
119         CTLFLAG_RW, &tcp_v6mssdflt , 0,
120         "Default TCP Maximum Segment Size for IPv6");
121 #endif
122
123 #if 0
124 static int      tcp_rttdflt = TCPTV_SRTTDFLT / PR_SLOWHZ;
125 SYSCTL_INT(_net_inet_tcp, TCPCTL_RTTDFLT, rttdflt, CTLFLAG_RW, 
126     &tcp_rttdflt , 0, "Default maximum TCP Round Trip Time");
127 #endif
128
129 int     tcp_do_rfc1323 = 1;
130 SYSCTL_INT(_net_inet_tcp, TCPCTL_DO_RFC1323, rfc1323, CTLFLAG_RW, 
131     &tcp_do_rfc1323 , 0, "Enable rfc1323 (high performance TCP) extensions");
132
133 int     tcp_do_rfc1644 = 0;
134 SYSCTL_INT(_net_inet_tcp, TCPCTL_DO_RFC1644, rfc1644, CTLFLAG_RW, 
135     &tcp_do_rfc1644 , 0, "Enable rfc1644 (TTCP) extensions");
136
137 static int      tcp_tcbhashsize = 0;
138 SYSCTL_INT(_net_inet_tcp, OID_AUTO, tcbhashsize, CTLFLAG_RD,
139      &tcp_tcbhashsize, 0, "Size of TCP control-block hashtable");
140
141 static int      do_tcpdrain = 1;
142 SYSCTL_INT(_net_inet_tcp, OID_AUTO, do_tcpdrain, CTLFLAG_RW, &do_tcpdrain, 0,
143      "Enable tcp_drain routine for extra help when low on mbufs");
144
145 SYSCTL_INT(_net_inet_tcp, OID_AUTO, pcbcount, CTLFLAG_RD, 
146     &tcbinfo.ipi_count, 0, "Number of active PCBs");
147
148 static int      icmp_may_rst = 1;
149 SYSCTL_INT(_net_inet_tcp, OID_AUTO, icmp_may_rst, CTLFLAG_RW, &icmp_may_rst, 0, 
150     "Certain ICMP unreachable messages may abort connections in SYN_SENT");
151
152 static int      tcp_isn_reseed_interval = 0;
153 SYSCTL_INT(_net_inet_tcp, OID_AUTO, isn_reseed_interval, CTLFLAG_RW,
154     &tcp_isn_reseed_interval, 0, "Seconds between reseeding of ISN secret");
155
156 /*
157  * TCP bandwidth limiting sysctls.  Note that the default lower bound of 
158  * 1024 exists only for debugging.  A good production default would be 
159  * something like 6100.
160  */
161 static int     tcp_inflight_enable = 0;
162 SYSCTL_INT(_net_inet_tcp, OID_AUTO, inflight_enable, CTLFLAG_RW,
163     &tcp_inflight_enable, 0, "Enable automatic TCP inflight data limiting");
164
165 static int     tcp_inflight_debug = 0;
166 SYSCTL_INT(_net_inet_tcp, OID_AUTO, inflight_debug, CTLFLAG_RW,
167     &tcp_inflight_debug, 0, "Debug TCP inflight calculations");
168
169 static int     tcp_inflight_min = 6144;
170 SYSCTL_INT(_net_inet_tcp, OID_AUTO, inflight_min, CTLFLAG_RW,
171     &tcp_inflight_min, 0, "Lower-bound for TCP inflight window");
172
173 static int     tcp_inflight_max = TCP_MAXWIN << TCP_MAX_WINSHIFT;
174 SYSCTL_INT(_net_inet_tcp, OID_AUTO, inflight_max, CTLFLAG_RW,
175     &tcp_inflight_max, 0, "Upper-bound for TCP inflight window");
176
177 static int     tcp_inflight_stab = 20;
178 SYSCTL_INT(_net_inet_tcp, OID_AUTO, inflight_stab, CTLFLAG_RW,
179     &tcp_inflight_stab, 0, "Slop in maximal packets / 10 (20 = 2 packets)");
180
181 static void     tcp_cleartaocache (void);
182 static void     tcp_notify (struct inpcb *, int);
183
184 /*
185  * Target size of TCP PCB hash tables. Must be a power of two.
186  *
187  * Note that this can be overridden by the kernel environment
188  * variable net.inet.tcp.tcbhashsize
189  */
190 #ifndef TCBHASHSIZE
191 #define TCBHASHSIZE     512
192 #endif
193
194 /*
195  * This is the actual shape of what we allocate using the zone
196  * allocator.  Doing it this way allows us to protect both structures
197  * using the same generation count, and also eliminates the overhead
198  * of allocating tcpcbs separately.  By hiding the structure here,
199  * we avoid changing most of the rest of the code (although it needs
200  * to be changed, eventually, for greater efficiency).
201  */
202 #define ALIGNMENT       32
203 #define ALIGNM1         (ALIGNMENT - 1)
204 struct  inp_tp {
205         union {
206                 struct  inpcb inp;
207                 char    align[(sizeof(struct inpcb) + ALIGNM1) & ~ALIGNM1];
208         } inp_tp_u;
209         struct  tcpcb tcb;
210         struct  callout inp_tp_rexmt, inp_tp_persist, inp_tp_keep, inp_tp_2msl;
211         struct  callout inp_tp_delack;
212 };
213 #undef ALIGNMENT
214 #undef ALIGNM1
215
216 /*
217  * Tcp initialization
218  */
219 void
220 tcp_init()
221 {
222         int hashsize = TCBHASHSIZE;
223
224         tcp_ccgen = 1;
225         tcp_cleartaocache();
226
227         tcp_delacktime = TCPTV_DELACK;
228         tcp_keepinit = TCPTV_KEEP_INIT;
229         tcp_keepidle = TCPTV_KEEP_IDLE;
230         tcp_keepintvl = TCPTV_KEEPINTVL;
231         tcp_maxpersistidle = TCPTV_KEEP_IDLE;
232         tcp_msl = TCPTV_MSL;
233         tcp_rexmit_min = TCPTV_MIN;
234         tcp_rexmit_slop = TCPTV_CPU_VAR;
235
236         LIST_INIT(&tcb);
237         tcbinfo.listhead = &tcb;
238         TUNABLE_INT_FETCH("net.inet.tcp.tcbhashsize", &hashsize);
239         if (!powerof2(hashsize)) {
240                 printf("WARNING: TCB hash size not a power of 2\n");
241                 hashsize = 512; /* safe default */
242         }
243         tcp_tcbhashsize = hashsize;
244         tcbinfo.hashbase = hashinit(hashsize, M_PCB, &tcbinfo.hashmask);
245         tcbinfo.porthashbase = hashinit(hashsize, M_PCB, &tcbinfo.porthashmask);
246         tcbinfo.bindhashbase = hashinit(hashsize, M_PCB, &tcbinfo.bindhashmask);
247         tcbinfo.ipi_zone = zinit("tcpcb", sizeof(struct inp_tp), maxsockets,
248                                  ZONE_INTERRUPT, 0);
249
250         tcp_reass_maxseg = nmbclusters / 16;
251         TUNABLE_INT_FETCH("net.inet.tcp.reass.maxsegments",
252             &tcp_reass_maxseg);
253
254 #ifdef INET6
255 #define TCP_MINPROTOHDR (sizeof(struct ip6_hdr) + sizeof(struct tcphdr))
256 #else /* INET6 */
257 #define TCP_MINPROTOHDR (sizeof(struct tcpiphdr))
258 #endif /* INET6 */
259         if (max_protohdr < TCP_MINPROTOHDR)
260                 max_protohdr = TCP_MINPROTOHDR;
261         if (max_linkhdr + TCP_MINPROTOHDR > MHLEN)
262                 panic("tcp_init");
263 #undef TCP_MINPROTOHDR
264
265         syncache_init();
266         tcp_thread_init();
267 }
268
269 /*
270  * Fill in the IP and TCP headers for an outgoing packet, given the tcpcb.
271  * tcp_template used to store this data in mbufs, but we now recopy it out
272  * of the tcpcb each time to conserve mbufs.
273  */
274 void
275 tcp_fillheaders(tp, ip_ptr, tcp_ptr)
276         struct tcpcb *tp;
277         void *ip_ptr;
278         void *tcp_ptr;
279 {
280         struct inpcb *inp = tp->t_inpcb;
281         struct tcphdr *tcp_hdr = (struct tcphdr *)tcp_ptr;
282
283 #ifdef INET6
284         if ((inp->inp_vflag & INP_IPV6) != 0) {
285                 struct ip6_hdr *ip6;
286
287                 ip6 = (struct ip6_hdr *)ip_ptr;
288                 ip6->ip6_flow = (ip6->ip6_flow & ~IPV6_FLOWINFO_MASK) |
289                         (inp->in6p_flowinfo & IPV6_FLOWINFO_MASK);
290                 ip6->ip6_vfc = (ip6->ip6_vfc & ~IPV6_VERSION_MASK) |
291                         (IPV6_VERSION & IPV6_VERSION_MASK);
292                 ip6->ip6_nxt = IPPROTO_TCP;
293                 ip6->ip6_plen = sizeof(struct tcphdr);
294                 ip6->ip6_src = inp->in6p_laddr;
295                 ip6->ip6_dst = inp->in6p_faddr;
296                 tcp_hdr->th_sum = 0;
297         } else
298 #endif
299         {
300         struct ip *ip = (struct ip *) ip_ptr;
301
302         ip->ip_vhl = IP_VHL_BORING;
303         ip->ip_tos = 0;
304         ip->ip_len = 0;
305         ip->ip_id = 0;
306         ip->ip_off = 0;
307         ip->ip_ttl = 0;
308         ip->ip_sum = 0;
309         ip->ip_p = IPPROTO_TCP;
310         ip->ip_src = inp->inp_laddr;
311         ip->ip_dst = inp->inp_faddr;
312         tcp_hdr->th_sum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr,
313                 htons(sizeof(struct tcphdr) + IPPROTO_TCP));
314         }
315
316         tcp_hdr->th_sport = inp->inp_lport;
317         tcp_hdr->th_dport = inp->inp_fport;
318         tcp_hdr->th_seq = 0;
319         tcp_hdr->th_ack = 0;
320         tcp_hdr->th_x2 = 0;
321         tcp_hdr->th_off = 5;
322         tcp_hdr->th_flags = 0;
323         tcp_hdr->th_win = 0;
324         tcp_hdr->th_urp = 0;
325 }
326
327 /*
328  * Create template to be used to send tcp packets on a connection.
329  * Allocates an mbuf and fills in a skeletal tcp/ip header.  The only
330  * use for this function is in keepalives, which use tcp_respond.
331  */
332 struct tcptemp *
333 tcp_maketemplate(tp)
334         struct tcpcb *tp;
335 {
336         struct mbuf *m;
337         struct tcptemp *n;
338
339         m = m_get(M_DONTWAIT, MT_HEADER);
340         if (m == NULL)
341                 return (0);
342         m->m_len = sizeof(struct tcptemp);
343         n = mtod(m, struct tcptemp *);
344
345         tcp_fillheaders(tp, (void *)&n->tt_ipgen, (void *)&n->tt_t);
346         return (n);
347 }
348
349 /*
350  * Send a single message to the TCP at address specified by
351  * the given TCP/IP header.  If m == 0, then we make a copy
352  * of the tcpiphdr at ti and send directly to the addressed host.
353  * This is used to force keep alive messages out using the TCP
354  * template for a connection.  If flags are given then we send
355  * a message back to the TCP which originated the * segment ti,
356  * and discard the mbuf containing it and any other attached mbufs.
357  *
358  * In any case the ack and sequence number of the transmitted
359  * segment are as specified by the parameters.
360  *
361  * NOTE: If m != NULL, then ti must point to *inside* the mbuf.
362  */
363 void
364 tcp_respond(tp, ipgen, th, m, ack, seq, flags)
365         struct tcpcb *tp;
366         void *ipgen;
367         struct tcphdr *th;
368         struct mbuf *m;
369         tcp_seq ack, seq;
370         int flags;
371 {
372         int tlen;
373         int win = 0;
374         struct route *ro = 0;
375         struct route sro;
376         struct ip *ip;
377         struct tcphdr *nth;
378 #ifdef INET6
379         struct route_in6 *ro6 = 0;
380         struct route_in6 sro6;
381         struct ip6_hdr *ip6;
382         int isipv6;
383 #endif /* INET6 */
384         int ipflags = 0;
385
386 #ifdef INET6
387         isipv6 = IP_VHL_V(((struct ip *)ipgen)->ip_vhl) == 6;
388         ip6 = ipgen;
389 #endif /* INET6 */
390         ip = ipgen;
391
392         if (tp) {
393                 if (!(flags & TH_RST)) {
394                         win = sbspace(&tp->t_inpcb->inp_socket->so_rcv);
395                         if (win > (long)TCP_MAXWIN << tp->rcv_scale)
396                                 win = (long)TCP_MAXWIN << tp->rcv_scale;
397                 }
398 #ifdef INET6
399                 if (isipv6)
400                         ro6 = &tp->t_inpcb->in6p_route;
401                 else
402 #endif /* INET6 */
403                 ro = &tp->t_inpcb->inp_route;
404         } else {
405 #ifdef INET6
406                 if (isipv6) {
407                         ro6 = &sro6;
408                         bzero(ro6, sizeof *ro6);
409                 } else
410 #endif /* INET6 */
411               {
412                 ro = &sro;
413                 bzero(ro, sizeof *ro);
414               }
415         }
416         if (m == 0) {
417                 m = m_gethdr(M_DONTWAIT, MT_HEADER);
418                 if (m == NULL)
419                         return;
420                 tlen = 0;
421                 m->m_data += max_linkhdr;
422 #ifdef INET6
423                 if (isipv6) {
424                         bcopy((caddr_t)ip6, mtod(m, caddr_t), 
425                               sizeof(struct ip6_hdr));
426                         ip6 = mtod(m, struct ip6_hdr *);
427                         nth = (struct tcphdr *)(ip6 + 1);
428                 } else
429 #endif /* INET6 */
430               {
431                 bcopy((caddr_t)ip, mtod(m, caddr_t), sizeof(struct ip));
432                 ip = mtod(m, struct ip *);
433                 nth = (struct tcphdr *)(ip + 1);
434               }
435                 bcopy((caddr_t)th, (caddr_t)nth, sizeof(struct tcphdr));
436                 flags = TH_ACK;
437         } else {
438                 m_freem(m->m_next);
439                 m->m_next = 0;
440                 m->m_data = (caddr_t)ipgen;
441                 /* m_len is set later */
442                 tlen = 0;
443 #define xchg(a,b,type) { type t; t=a; a=b; b=t; }
444 #ifdef INET6
445                 if (isipv6) {
446                         xchg(ip6->ip6_dst, ip6->ip6_src, struct in6_addr);
447                         nth = (struct tcphdr *)(ip6 + 1);
448                 } else
449 #endif /* INET6 */
450               {
451                 xchg(ip->ip_dst.s_addr, ip->ip_src.s_addr, n_long);
452                 nth = (struct tcphdr *)(ip + 1);
453               }
454                 if (th != nth) {
455                         /*
456                          * this is usually a case when an extension header
457                          * exists between the IPv6 header and the
458                          * TCP header.
459                          */
460                         nth->th_sport = th->th_sport;
461                         nth->th_dport = th->th_dport;
462                 }
463                 xchg(nth->th_dport, nth->th_sport, n_short);
464 #undef xchg
465         }
466 #ifdef INET6
467         if (isipv6) {
468                 ip6->ip6_flow = 0;
469                 ip6->ip6_vfc = IPV6_VERSION;
470                 ip6->ip6_nxt = IPPROTO_TCP;
471                 ip6->ip6_plen = htons((u_short)(sizeof (struct tcphdr) +
472                                                 tlen));
473                 tlen += sizeof (struct ip6_hdr) + sizeof (struct tcphdr);
474         } else
475 #endif
476       {
477         tlen += sizeof (struct tcpiphdr);
478         ip->ip_len = tlen;
479         ip->ip_ttl = ip_defttl;
480       }
481         m->m_len = tlen;
482         m->m_pkthdr.len = tlen;
483         m->m_pkthdr.rcvif = (struct ifnet *) 0;
484         nth->th_seq = htonl(seq);
485         nth->th_ack = htonl(ack);
486         nth->th_x2 = 0;
487         nth->th_off = sizeof (struct tcphdr) >> 2;
488         nth->th_flags = flags;
489         if (tp)
490                 nth->th_win = htons((u_short) (win >> tp->rcv_scale));
491         else
492                 nth->th_win = htons((u_short)win);
493         nth->th_urp = 0;
494 #ifdef INET6
495         if (isipv6) {
496                 nth->th_sum = 0;
497                 nth->th_sum = in6_cksum(m, IPPROTO_TCP,
498                                         sizeof(struct ip6_hdr),
499                                         tlen - sizeof(struct ip6_hdr));
500                 ip6->ip6_hlim = in6_selecthlim(tp ? tp->t_inpcb : NULL,
501                                                ro6 && ro6->ro_rt ?
502                                                ro6->ro_rt->rt_ifp :
503                                                NULL);
504         } else
505 #endif /* INET6 */
506       {
507         nth->th_sum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr,
508             htons((u_short)(tlen - sizeof(struct ip) + ip->ip_p)));
509         m->m_pkthdr.csum_flags = CSUM_TCP;
510         m->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum);
511       }
512 #ifdef TCPDEBUG
513         if (tp == NULL || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
514                 tcp_trace(TA_OUTPUT, 0, tp, mtod(m, void *), th, 0);
515 #endif
516 #ifdef INET6
517         if (isipv6) {
518                 (void)ip6_output(m, NULL, ro6, ipflags, NULL, NULL,
519                         tp ? tp->t_inpcb : NULL);
520                 if (ro6 == &sro6 && ro6->ro_rt) {
521                         RTFREE(ro6->ro_rt);
522                         ro6->ro_rt = NULL;
523                 }
524         } else
525 #endif /* INET6 */
526       {
527         (void) ip_output(m, NULL, ro, ipflags, NULL, tp ? tp->t_inpcb : NULL);
528         if (ro == &sro && ro->ro_rt) {
529                 RTFREE(ro->ro_rt);
530                 ro->ro_rt = NULL;
531         }
532       }
533 }
534
535 /*
536  * Create a new TCP control block, making an
537  * empty reassembly queue and hooking it to the argument
538  * protocol control block.  The `inp' parameter must have
539  * come from the zone allocator set up in tcp_init().
540  */
541 struct tcpcb *
542 tcp_newtcpcb(inp)
543         struct inpcb *inp;
544 {
545         struct inp_tp *it;
546         struct tcpcb *tp;
547 #ifdef INET6
548         int isipv6 = (inp->inp_vflag & INP_IPV6) != 0;
549 #endif /* INET6 */
550
551         it = (struct inp_tp *)inp;
552         tp = &it->tcb;
553         bzero((char *) tp, sizeof(struct tcpcb));
554         LIST_INIT(&tp->t_segq);
555         tp->t_maxseg = tp->t_maxopd =
556 #ifdef INET6
557                 isipv6 ? tcp_v6mssdflt :
558 #endif /* INET6 */
559                 tcp_mssdflt;
560
561         /* Set up our timeouts. */
562         callout_init(tp->tt_rexmt = &it->inp_tp_rexmt);
563         callout_init(tp->tt_persist = &it->inp_tp_persist);
564         callout_init(tp->tt_keep = &it->inp_tp_keep);
565         callout_init(tp->tt_2msl = &it->inp_tp_2msl);
566         callout_init(tp->tt_delack = &it->inp_tp_delack);
567
568         if (tcp_do_rfc1323)
569                 tp->t_flags = (TF_REQ_SCALE|TF_REQ_TSTMP);
570         if (tcp_do_rfc1644)
571                 tp->t_flags |= TF_REQ_CC;
572         tp->t_inpcb = inp;      /* XXX */
573         /*
574          * Init srtt to TCPTV_SRTTBASE (0), so we can tell that we have no
575          * rtt estimate.  Set rttvar so that srtt + 4 * rttvar gives
576          * reasonable initial retransmit time.
577          */
578         tp->t_srtt = TCPTV_SRTTBASE;
579         tp->t_rttvar = ((TCPTV_RTOBASE - TCPTV_SRTTBASE) << TCP_RTTVAR_SHIFT) / 4;
580         tp->t_rttmin = tcp_rexmit_min;
581         tp->t_rxtcur = TCPTV_RTOBASE;
582         tp->snd_cwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT;
583         tp->snd_bwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT;
584         tp->snd_ssthresh = TCP_MAXWIN << TCP_MAX_WINSHIFT;
585         tp->t_rcvtime = ticks;
586         tp->t_bw_rtttime = ticks;
587         /*
588          * IPv4 TTL initialization is necessary for an IPv6 socket as well,
589          * because the socket may be bound to an IPv6 wildcard address,
590          * which may match an IPv4-mapped IPv6 address.
591          */
592         inp->inp_ip_ttl = ip_defttl;
593         inp->inp_ppcb = (caddr_t)tp;
594         return (tp);            /* XXX */
595 }
596
597 /*
598  * Drop a TCP connection, reporting
599  * the specified error.  If connection is synchronized,
600  * then send a RST to peer.
601  */
602 struct tcpcb *
603 tcp_drop(tp, errno)
604         struct tcpcb *tp;
605         int errno;
606 {
607         struct socket *so = tp->t_inpcb->inp_socket;
608
609         if (TCPS_HAVERCVDSYN(tp->t_state)) {
610                 tp->t_state = TCPS_CLOSED;
611                 (void) tcp_output(tp);
612                 tcpstat.tcps_drops++;
613         } else
614                 tcpstat.tcps_conndrops++;
615         if (errno == ETIMEDOUT && tp->t_softerror)
616                 errno = tp->t_softerror;
617         so->so_error = errno;
618         return (tcp_close(tp));
619 }
620
621 /*
622  * Close a TCP control block:
623  *      discard all space held by the tcp
624  *      discard internet protocol block
625  *      wake up any sleepers
626  */
627 struct tcpcb *
628 tcp_close(tp)
629         struct tcpcb *tp;
630 {
631         struct tseg_qent *q;
632         struct inpcb *inp = tp->t_inpcb;
633         struct socket *so = inp->inp_socket;
634 #ifdef INET6
635         int isipv6 = (inp->inp_vflag & INP_IPV6) != 0;
636 #endif /* INET6 */
637         struct rtentry *rt;
638         int dosavessthresh;
639
640         /*
641          * Make sure that all of our timers are stopped before we
642          * delete the PCB.
643          */
644         callout_stop(tp->tt_rexmt);
645         callout_stop(tp->tt_persist);
646         callout_stop(tp->tt_keep);
647         callout_stop(tp->tt_2msl);
648         callout_stop(tp->tt_delack);
649
650         /*
651          * If we got enough samples through the srtt filter,
652          * save the rtt and rttvar in the routing entry.
653          * 'Enough' is arbitrarily defined as the 16 samples.
654          * 16 samples is enough for the srtt filter to converge
655          * to within 5% of the correct value; fewer samples and
656          * we could save a very bogus rtt.
657          *
658          * Don't update the default route's characteristics and don't
659          * update anything that the user "locked".
660          */
661         if (tp->t_rttupdated >= 16) {
662                 u_long i = 0;
663 #ifdef INET6
664                 if (isipv6) {
665                         struct sockaddr_in6 *sin6;
666
667                         if ((rt = inp->in6p_route.ro_rt) == NULL)
668                                 goto no_valid_rt;
669                         sin6 = (struct sockaddr_in6 *)rt_key(rt);
670                         if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr))
671                                 goto no_valid_rt;
672                 }
673                 else
674 #endif /* INET6 */              
675                 if ((rt = inp->inp_route.ro_rt) == NULL ||
676                     ((struct sockaddr_in *)rt_key(rt))->sin_addr.s_addr
677                     == INADDR_ANY)
678                         goto no_valid_rt;
679
680                 if ((rt->rt_rmx.rmx_locks & RTV_RTT) == 0) {
681                         i = tp->t_srtt *
682                             (RTM_RTTUNIT / (hz * TCP_RTT_SCALE));
683                         if (rt->rt_rmx.rmx_rtt && i)
684                                 /*
685                                  * filter this update to half the old & half
686                                  * the new values, converting scale.
687                                  * See route.h and tcp_var.h for a
688                                  * description of the scaling constants.
689                                  */
690                                 rt->rt_rmx.rmx_rtt =
691                                     (rt->rt_rmx.rmx_rtt + i) / 2;
692                         else
693                                 rt->rt_rmx.rmx_rtt = i;
694                         tcpstat.tcps_cachedrtt++;
695                 }
696                 if ((rt->rt_rmx.rmx_locks & RTV_RTTVAR) == 0) {
697                         i = tp->t_rttvar *
698                             (RTM_RTTUNIT / (hz * TCP_RTTVAR_SCALE));
699                         if (rt->rt_rmx.rmx_rttvar && i)
700                                 rt->rt_rmx.rmx_rttvar =
701                                     (rt->rt_rmx.rmx_rttvar + i) / 2;
702                         else
703                                 rt->rt_rmx.rmx_rttvar = i;
704                         tcpstat.tcps_cachedrttvar++;
705                 }
706                 /*
707                  * The old comment here said:
708                  * update the pipelimit (ssthresh) if it has been updated
709                  * already or if a pipesize was specified & the threshhold
710                  * got below half the pipesize.  I.e., wait for bad news
711                  * before we start updating, then update on both good
712                  * and bad news.
713                  *
714                  * But we want to save the ssthresh even if no pipesize is
715                  * specified explicitly in the route, because such
716                  * connections still have an implicit pipesize specified
717                  * by the global tcp_sendspace.  In the absence of a reliable
718                  * way to calculate the pipesize, it will have to do.
719                  */
720                 i = tp->snd_ssthresh;
721                 if (rt->rt_rmx.rmx_sendpipe != 0)
722                         dosavessthresh = (i < rt->rt_rmx.rmx_sendpipe / 2);
723                 else
724                         dosavessthresh = (i < so->so_snd.sb_hiwat / 2);
725                 if (((rt->rt_rmx.rmx_locks & RTV_SSTHRESH) == 0 &&
726                      i != 0 && rt->rt_rmx.rmx_ssthresh != 0)
727                     || dosavessthresh) {
728                         /*
729                          * convert the limit from user data bytes to
730                          * packets then to packet data bytes.
731                          */
732                         i = (i + tp->t_maxseg / 2) / tp->t_maxseg;
733                         if (i < 2)
734                                 i = 2;
735                         i *= (u_long)(tp->t_maxseg +
736 #ifdef INET6
737                                       (isipv6 ? sizeof (struct ip6_hdr) +
738                                                sizeof (struct tcphdr) :
739 #endif
740                                        sizeof (struct tcpiphdr)
741 #ifdef INET6
742                                        )
743 #endif
744                                       );
745                         if (rt->rt_rmx.rmx_ssthresh)
746                                 rt->rt_rmx.rmx_ssthresh =
747                                     (rt->rt_rmx.rmx_ssthresh + i) / 2;
748                         else
749                                 rt->rt_rmx.rmx_ssthresh = i;
750                         tcpstat.tcps_cachedssthresh++;
751                 }
752         }
753     no_valid_rt:
754         /* free the reassembly queue, if any */
755         while((q = LIST_FIRST(&tp->t_segq)) != NULL) {
756                 LIST_REMOVE(q, tqe_q);
757                 m_freem(q->tqe_m);
758                 FREE(q, M_TSEGQ);
759                 tcp_reass_qsize--;
760         }
761         inp->inp_ppcb = NULL;
762         soisdisconnected(so);
763 #ifdef INET6
764         if (INP_CHECK_SOCKAF(so, AF_INET6))
765                 in6_pcbdetach(inp);
766         else
767 #endif /* INET6 */
768         in_pcbdetach(inp);
769         tcpstat.tcps_closed++;
770         return ((struct tcpcb *)0);
771 }
772
773 void
774 tcp_drain()
775 {
776         if (do_tcpdrain)
777         {
778                 struct inpcb *inpb;
779                 struct tcpcb *tcpb;
780                 struct tseg_qent *te;
781
782         /*
783          * Walk the tcpbs, if existing, and flush the reassembly queue,
784          * if there is one...
785          * XXX: The "Net/3" implementation doesn't imply that the TCP
786          *      reassembly queue should be flushed, but in a situation
787          *      where we're really low on mbufs, this is potentially
788          *      usefull.        
789          */
790                 LIST_FOREACH(inpb, tcbinfo.listhead, inp_list) {
791                         if ((tcpb = intotcpcb(inpb))) {
792                                 while ((te = LIST_FIRST(&tcpb->t_segq))
793                                     != NULL) {
794                                         LIST_REMOVE(te, tqe_q);
795                                         m_freem(te->tqe_m);
796                                         FREE(te, M_TSEGQ);
797                                         tcp_reass_qsize--;
798                                 }
799                         }
800                 }
801
802         }
803 }
804
805 /*
806  * Notify a tcp user of an asynchronous error;
807  * store error as soft error, but wake up user
808  * (for now, won't do anything until can select for soft error).
809  *
810  * Do not wake up user since there currently is no mechanism for
811  * reporting soft errors (yet - a kqueue filter may be added).
812  */
813 static void
814 tcp_notify(inp, error)
815         struct inpcb *inp;
816         int error;
817 {
818         struct tcpcb *tp = (struct tcpcb *)inp->inp_ppcb;
819
820         /*
821          * Ignore some errors if we are hooked up.
822          * If connection hasn't completed, has retransmitted several times,
823          * and receives a second error, give up now.  This is better
824          * than waiting a long time to establish a connection that
825          * can never complete.
826          */
827         if (tp->t_state == TCPS_ESTABLISHED &&
828              (error == EHOSTUNREACH || error == ENETUNREACH ||
829               error == EHOSTDOWN)) {
830                 return;
831         } else if (tp->t_state < TCPS_ESTABLISHED && tp->t_rxtshift > 3 &&
832             tp->t_softerror)
833                 tcp_drop(tp, error);
834         else
835                 tp->t_softerror = error;
836 #if 0
837         wakeup((caddr_t) &so->so_timeo);
838         sorwakeup(so);
839         sowwakeup(so);
840 #endif
841 }
842
843 static int
844 tcp_pcblist(SYSCTL_HANDLER_ARGS)
845 {
846         int error, i, n, s;
847         struct inpcb *inp, **inp_list;
848         inp_gen_t gencnt;
849         struct xinpgen xig;
850
851         /*
852          * The process of preparing the TCB list is too time-consuming and
853          * resource-intensive to repeat twice on every request.
854          */
855         if (req->oldptr == 0) {
856                 n = tcbinfo.ipi_count;
857                 req->oldidx = 2 * (sizeof xig)
858                         + (n + n/8) * sizeof(struct xtcpcb);
859                 return 0;
860         }
861
862         if (req->newptr != 0)
863                 return EPERM;
864
865         /*
866          * OK, now we're committed to doing something.
867          */
868         s = splnet();
869         gencnt = tcbinfo.ipi_gencnt;
870         n = tcbinfo.ipi_count;
871         splx(s);
872
873         xig.xig_len = sizeof xig;
874         xig.xig_count = n;
875         xig.xig_gen = gencnt;
876         xig.xig_sogen = so_gencnt;
877         error = SYSCTL_OUT(req, &xig, sizeof xig);
878         if (error)
879                 return error;
880
881         inp_list = malloc(n * sizeof *inp_list, M_TEMP, M_WAITOK);
882         if (inp_list == 0)
883                 return ENOMEM;
884         
885         s = splnet();
886         for (inp = LIST_FIRST(tcbinfo.listhead), i = 0; inp && i < n;
887              inp = LIST_NEXT(inp, inp_list)) {
888                 if (inp->inp_gencnt <= gencnt && !prison_xinpcb(req->td, inp))
889                         inp_list[i++] = inp;
890         }
891         splx(s);
892         n = i;
893
894         error = 0;
895         for (i = 0; i < n; i++) {
896                 inp = inp_list[i];
897                 if (inp->inp_gencnt <= gencnt) {
898                         struct xtcpcb xt;
899                         caddr_t inp_ppcb;
900                         xt.xt_len = sizeof xt;
901                         /* XXX should avoid extra copy */
902                         bcopy(inp, &xt.xt_inp, sizeof *inp);
903                         inp_ppcb = inp->inp_ppcb;
904                         if (inp_ppcb != NULL)
905                                 bcopy(inp_ppcb, &xt.xt_tp, sizeof xt.xt_tp);
906                         else
907                                 bzero((char *) &xt.xt_tp, sizeof xt.xt_tp);
908                         if (inp->inp_socket)
909                                 sotoxsocket(inp->inp_socket, &xt.xt_socket);
910                         error = SYSCTL_OUT(req, &xt, sizeof xt);
911                 }
912         }
913         if (!error) {
914                 /*
915                  * Give the user an updated idea of our state.
916                  * If the generation differs from what we told
917                  * her before, she knows that something happened
918                  * while we were processing this request, and it
919                  * might be necessary to retry.
920                  */
921                 s = splnet();
922                 xig.xig_gen = tcbinfo.ipi_gencnt;
923                 xig.xig_sogen = so_gencnt;
924                 xig.xig_count = tcbinfo.ipi_count;
925                 splx(s);
926                 error = SYSCTL_OUT(req, &xig, sizeof xig);
927         }
928         free(inp_list, M_TEMP);
929         return error;
930 }
931
932 SYSCTL_PROC(_net_inet_tcp, TCPCTL_PCBLIST, pcblist, CTLFLAG_RD, 0, 0,
933             tcp_pcblist, "S,xtcpcb", "List of active TCP connections");
934
935 static int
936 tcp_getcred(SYSCTL_HANDLER_ARGS)
937 {
938         struct sockaddr_in addrs[2];
939         struct inpcb *inp;
940         int error, s;
941
942         error = suser(req->td);
943         if (error)
944                 return (error);
945         error = SYSCTL_IN(req, addrs, sizeof(addrs));
946         if (error)
947                 return (error);
948         s = splnet();
949         inp = in_pcblookup_hash(&tcbinfo, addrs[1].sin_addr, addrs[1].sin_port,
950             addrs[0].sin_addr, addrs[0].sin_port, 0, NULL);
951         if (inp == NULL || inp->inp_socket == NULL) {
952                 error = ENOENT;
953                 goto out;
954         }
955         error = SYSCTL_OUT(req, inp->inp_socket->so_cred, sizeof(struct ucred));
956 out:
957         splx(s);
958         return (error);
959 }
960
961 SYSCTL_PROC(_net_inet_tcp, OID_AUTO, getcred, CTLTYPE_OPAQUE|CTLFLAG_RW,
962     0, 0, tcp_getcred, "S,ucred", "Get the ucred of a TCP connection");
963
964 #ifdef INET6
965 static int
966 tcp6_getcred(SYSCTL_HANDLER_ARGS)
967 {
968         struct sockaddr_in6 addrs[2];
969         struct inpcb *inp;
970         int error, s, mapped = 0;
971
972         error = suser(req->td);
973         if (error)
974                 return (error);
975         error = SYSCTL_IN(req, addrs, sizeof(addrs));
976         if (error)
977                 return (error);
978         if (IN6_IS_ADDR_V4MAPPED(&addrs[0].sin6_addr)) {
979                 if (IN6_IS_ADDR_V4MAPPED(&addrs[1].sin6_addr))
980                         mapped = 1;
981                 else
982                         return (EINVAL);
983         }
984         s = splnet();
985         if (mapped == 1)
986                 inp = in_pcblookup_hash(&tcbinfo,
987                         *(struct in_addr *)&addrs[1].sin6_addr.s6_addr[12],
988                         addrs[1].sin6_port,
989                         *(struct in_addr *)&addrs[0].sin6_addr.s6_addr[12],
990                         addrs[0].sin6_port,
991                         0, NULL);
992         else
993                 inp = in6_pcblookup_hash(&tcbinfo, &addrs[1].sin6_addr,
994                                  addrs[1].sin6_port,
995                                  &addrs[0].sin6_addr, addrs[0].sin6_port,
996                                  0, NULL);
997         if (inp == NULL || inp->inp_socket == NULL) {
998                 error = ENOENT;
999                 goto out;
1000         }
1001         error = SYSCTL_OUT(req, inp->inp_socket->so_cred, 
1002                            sizeof(struct ucred));
1003 out:
1004         splx(s);
1005         return (error);
1006 }
1007
1008 SYSCTL_PROC(_net_inet6_tcp6, OID_AUTO, getcred, CTLTYPE_OPAQUE|CTLFLAG_RW,
1009             0, 0,
1010             tcp6_getcred, "S,ucred", "Get the ucred of a TCP6 connection");
1011 #endif
1012
1013
1014 void
1015 tcp_ctlinput(cmd, sa, vip)
1016         int cmd;
1017         struct sockaddr *sa;
1018         void *vip;
1019 {
1020         struct ip *ip = vip;
1021         struct tcphdr *th;
1022         struct in_addr faddr;
1023         struct inpcb *inp;
1024         struct tcpcb *tp;
1025         void (*notify) (struct inpcb *, int) = tcp_notify;
1026         tcp_seq icmp_seq;
1027         int s;
1028
1029         faddr = ((struct sockaddr_in *)sa)->sin_addr;
1030         if (sa->sa_family != AF_INET || faddr.s_addr == INADDR_ANY)
1031                 return;
1032
1033         if (cmd == PRC_QUENCH)
1034                 notify = tcp_quench;
1035         else if (icmp_may_rst && (cmd == PRC_UNREACH_ADMIN_PROHIB ||
1036                 cmd == PRC_UNREACH_PORT || cmd == PRC_TIMXCEED_INTRANS) && ip)
1037                 notify = tcp_drop_syn_sent;
1038         else if (cmd == PRC_MSGSIZE)
1039                 notify = tcp_mtudisc;
1040         else if (PRC_IS_REDIRECT(cmd)) {
1041                 ip = 0;
1042                 notify = in_rtchange;
1043         } else if (cmd == PRC_HOSTDEAD)
1044                 ip = 0;
1045         else if ((unsigned)cmd > PRC_NCMDS || inetctlerrmap[cmd] == 0)
1046                 return;
1047         if (ip) {
1048                 s = splnet();
1049                 th = (struct tcphdr *)((caddr_t)ip 
1050                                        + (IP_VHL_HL(ip->ip_vhl) << 2));
1051                 inp = in_pcblookup_hash(&tcbinfo, faddr, th->th_dport,
1052                     ip->ip_src, th->th_sport, 0, NULL);
1053                 if (inp != NULL && inp->inp_socket != NULL) {
1054                         icmp_seq = htonl(th->th_seq);
1055                         tp = intotcpcb(inp);
1056                         if (SEQ_GEQ(icmp_seq, tp->snd_una) &&
1057                             SEQ_LT(icmp_seq, tp->snd_max))
1058                                 (*notify)(inp, inetctlerrmap[cmd]);
1059                 } else {
1060                         struct in_conninfo inc;
1061
1062                         inc.inc_fport = th->th_dport;
1063                         inc.inc_lport = th->th_sport;
1064                         inc.inc_faddr = faddr;
1065                         inc.inc_laddr = ip->ip_src;
1066 #ifdef INET6
1067                         inc.inc_isipv6 = 0;
1068 #endif
1069                         syncache_unreach(&inc, th);
1070                 }
1071                 splx(s);
1072         } else
1073                 in_pcbnotifyall(&tcb, faddr, inetctlerrmap[cmd], notify);
1074 }
1075
1076 #ifdef INET6
1077 void
1078 tcp6_ctlinput(cmd, sa, d)
1079         int cmd;
1080         struct sockaddr *sa;
1081         void *d;
1082 {
1083         struct tcphdr th;
1084         void (*notify) (struct inpcb *, int) = tcp_notify;
1085         struct ip6_hdr *ip6;
1086         struct mbuf *m;
1087         struct ip6ctlparam *ip6cp = NULL;
1088         const struct sockaddr_in6 *sa6_src = NULL;
1089         int off;
1090         struct tcp_portonly {
1091                 u_int16_t th_sport;
1092                 u_int16_t th_dport;
1093         } *thp;
1094
1095         if (sa->sa_family != AF_INET6 ||
1096             sa->sa_len != sizeof(struct sockaddr_in6))
1097                 return;
1098
1099         if (cmd == PRC_QUENCH)
1100                 notify = tcp_quench;
1101         else if (cmd == PRC_MSGSIZE)
1102                 notify = tcp_mtudisc;
1103         else if (!PRC_IS_REDIRECT(cmd) &&
1104                  ((unsigned)cmd > PRC_NCMDS || inet6ctlerrmap[cmd] == 0))
1105                 return;
1106
1107         /* if the parameter is from icmp6, decode it. */
1108         if (d != NULL) {
1109                 ip6cp = (struct ip6ctlparam *)d;
1110                 m = ip6cp->ip6c_m;
1111                 ip6 = ip6cp->ip6c_ip6;
1112                 off = ip6cp->ip6c_off;
1113                 sa6_src = ip6cp->ip6c_src;
1114         } else {
1115                 m = NULL;
1116                 ip6 = NULL;
1117                 off = 0;        /* fool gcc */
1118                 sa6_src = &sa6_any;
1119         }
1120
1121         if (ip6) {
1122                 struct in_conninfo inc;
1123                 /*
1124                  * XXX: We assume that when IPV6 is non NULL,
1125                  * M and OFF are valid.
1126                  */
1127
1128                 /* check if we can safely examine src and dst ports */
1129                 if (m->m_pkthdr.len < off + sizeof(*thp))
1130                         return;
1131
1132                 bzero(&th, sizeof(th));
1133                 m_copydata(m, off, sizeof(*thp), (caddr_t)&th);
1134
1135                 in6_pcbnotify(&tcb, sa, th.th_dport,
1136                     (struct sockaddr *)ip6cp->ip6c_src,
1137                     th.th_sport, cmd, notify);
1138
1139                 inc.inc_fport = th.th_dport;
1140                 inc.inc_lport = th.th_sport;
1141                 inc.inc6_faddr = ((struct sockaddr_in6 *)sa)->sin6_addr;
1142                 inc.inc6_laddr = ip6cp->ip6c_src->sin6_addr;
1143                 inc.inc_isipv6 = 1;
1144                 syncache_unreach(&inc, &th);
1145         } else
1146                 in6_pcbnotify(&tcb, sa, 0, (const struct sockaddr *)sa6_src,
1147                               0, cmd, notify);
1148 }
1149 #endif /* INET6 */
1150
1151
1152 /*
1153  * Following is where TCP initial sequence number generation occurs.
1154  *
1155  * There are two places where we must use initial sequence numbers:
1156  * 1.  In SYN-ACK packets.
1157  * 2.  In SYN packets.
1158  *
1159  * All ISNs for SYN-ACK packets are generated by the syncache.  See
1160  * tcp_syncache.c for details.
1161  *
1162  * The ISNs in SYN packets must be monotonic; TIME_WAIT recycling
1163  * depends on this property.  In addition, these ISNs should be
1164  * unguessable so as to prevent connection hijacking.  To satisfy
1165  * the requirements of this situation, the algorithm outlined in
1166  * RFC 1948 is used to generate sequence numbers.
1167  *
1168  * Implementation details:
1169  *
1170  * Time is based off the system timer, and is corrected so that it
1171  * increases by one megabyte per second.  This allows for proper
1172  * recycling on high speed LANs while still leaving over an hour
1173  * before rollover.
1174  *
1175  * net.inet.tcp.isn_reseed_interval controls the number of seconds
1176  * between seeding of isn_secret.  This is normally set to zero,
1177  * as reseeding should not be necessary.
1178  *
1179  */
1180
1181 #define ISN_BYTES_PER_SECOND 1048576
1182
1183 u_char isn_secret[32];
1184 int isn_last_reseed;
1185 MD5_CTX isn_ctx;
1186
1187 tcp_seq
1188 tcp_new_isn(tp)
1189         struct tcpcb *tp;
1190 {
1191         u_int32_t md5_buffer[4];
1192         tcp_seq new_isn;
1193
1194         /* Seed if this is the first use, reseed if requested. */
1195         if ((isn_last_reseed == 0) || ((tcp_isn_reseed_interval > 0) &&
1196              (((u_int)isn_last_reseed + (u_int)tcp_isn_reseed_interval*hz)
1197                 < (u_int)ticks))) {
1198                 read_random_unlimited(&isn_secret, sizeof(isn_secret));
1199                 isn_last_reseed = ticks;
1200         }
1201                 
1202         /* Compute the md5 hash and return the ISN. */
1203         MD5Init(&isn_ctx);
1204         MD5Update(&isn_ctx, (u_char *) &tp->t_inpcb->inp_fport, sizeof(u_short));
1205         MD5Update(&isn_ctx, (u_char *) &tp->t_inpcb->inp_lport, sizeof(u_short));
1206 #ifdef INET6
1207         if ((tp->t_inpcb->inp_vflag & INP_IPV6) != 0) {
1208                 MD5Update(&isn_ctx, (u_char *) &tp->t_inpcb->in6p_faddr,
1209                           sizeof(struct in6_addr));
1210                 MD5Update(&isn_ctx, (u_char *) &tp->t_inpcb->in6p_laddr,
1211                           sizeof(struct in6_addr));
1212         } else
1213 #endif
1214         {
1215                 MD5Update(&isn_ctx, (u_char *) &tp->t_inpcb->inp_faddr,
1216                           sizeof(struct in_addr));
1217                 MD5Update(&isn_ctx, (u_char *) &tp->t_inpcb->inp_laddr,
1218                           sizeof(struct in_addr));
1219         }
1220         MD5Update(&isn_ctx, (u_char *) &isn_secret, sizeof(isn_secret));
1221         MD5Final((u_char *) &md5_buffer, &isn_ctx);
1222         new_isn = (tcp_seq) md5_buffer[0];
1223         new_isn += ticks * (ISN_BYTES_PER_SECOND / hz);
1224         return new_isn;
1225 }
1226
1227 /*
1228  * When a source quench is received, close congestion window
1229  * to one segment.  We will gradually open it again as we proceed.
1230  */
1231 void
1232 tcp_quench(inp, errno)
1233         struct inpcb *inp;
1234         int errno;
1235 {
1236         struct tcpcb *tp = intotcpcb(inp);
1237
1238         if (tp)
1239                 tp->snd_cwnd = tp->t_maxseg;
1240 }
1241
1242 /*
1243  * When a specific ICMP unreachable message is received and the
1244  * connection state is SYN-SENT, drop the connection.  This behavior
1245  * is controlled by the icmp_may_rst sysctl.
1246  */
1247 void
1248 tcp_drop_syn_sent(inp, errno)
1249         struct inpcb *inp;
1250         int errno;
1251 {
1252         struct tcpcb *tp = intotcpcb(inp);
1253
1254         if (tp && tp->t_state == TCPS_SYN_SENT)
1255                 tcp_drop(tp, errno);
1256 }
1257
1258 /*
1259  * When `need fragmentation' ICMP is received, update our idea of the MSS
1260  * based on the new value in the route.  Also nudge TCP to send something,
1261  * since we know the packet we just sent was dropped.
1262  * This duplicates some code in the tcp_mss() function in tcp_input.c.
1263  */
1264 void
1265 tcp_mtudisc(inp, errno)
1266         struct inpcb *inp;
1267         int errno;
1268 {
1269         struct tcpcb *tp = intotcpcb(inp);
1270         struct rtentry *rt;
1271         struct rmxp_tao *taop;
1272         struct socket *so = inp->inp_socket;
1273         int offered;
1274         int mss;
1275 #ifdef INET6
1276         int isipv6 = (tp->t_inpcb->inp_vflag & INP_IPV6) != 0;
1277 #endif /* INET6 */
1278
1279         if (tp) {
1280 #ifdef INET6
1281                 if (isipv6)
1282                         rt = tcp_rtlookup6(&inp->inp_inc);
1283                 else
1284 #endif /* INET6 */
1285                 rt = tcp_rtlookup(&inp->inp_inc);
1286                 if (!rt || !rt->rt_rmx.rmx_mtu) {
1287                         tp->t_maxopd = tp->t_maxseg =
1288 #ifdef INET6
1289                                 isipv6 ? tcp_v6mssdflt :
1290 #endif /* INET6 */
1291                                 tcp_mssdflt;
1292                         return;
1293                 }
1294                 taop = rmx_taop(rt->rt_rmx);
1295                 offered = taop->tao_mssopt;
1296                 mss = rt->rt_rmx.rmx_mtu -
1297 #ifdef INET6
1298                         (isipv6 ?
1299                          sizeof(struct ip6_hdr) + sizeof(struct tcphdr) :
1300 #endif /* INET6 */
1301                          sizeof(struct tcpiphdr)
1302 #ifdef INET6
1303                          )
1304 #endif /* INET6 */
1305                         ;
1306
1307                 if (offered)
1308                         mss = min(mss, offered);
1309                 /*
1310                  * XXX - The above conditional probably violates the TCP
1311                  * spec.  The problem is that, since we don't know the
1312                  * other end's MSS, we are supposed to use a conservative
1313                  * default.  But, if we do that, then MTU discovery will
1314                  * never actually take place, because the conservative
1315                  * default is much less than the MTUs typically seen
1316                  * on the Internet today.  For the moment, we'll sweep
1317                  * this under the carpet.
1318                  *
1319                  * The conservative default might not actually be a problem
1320                  * if the only case this occurs is when sending an initial
1321                  * SYN with options and data to a host we've never talked
1322                  * to before.  Then, they will reply with an MSS value which
1323                  * will get recorded and the new parameters should get
1324                  * recomputed.  For Further Study.
1325                  */
1326                 if (tp->t_maxopd <= mss)
1327                         return;
1328                 tp->t_maxopd = mss;
1329
1330                 if ((tp->t_flags & (TF_REQ_TSTMP|TF_NOOPT)) == TF_REQ_TSTMP &&
1331                     (tp->t_flags & TF_RCVD_TSTMP) == TF_RCVD_TSTMP)
1332                         mss -= TCPOLEN_TSTAMP_APPA;
1333                 if ((tp->t_flags & (TF_REQ_CC|TF_NOOPT)) == TF_REQ_CC &&
1334                     (tp->t_flags & TF_RCVD_CC) == TF_RCVD_CC)
1335                         mss -= TCPOLEN_CC_APPA;
1336 #if     (MCLBYTES & (MCLBYTES - 1)) == 0
1337                 if (mss > MCLBYTES)
1338                         mss &= ~(MCLBYTES-1);
1339 #else
1340                 if (mss > MCLBYTES)
1341                         mss = mss / MCLBYTES * MCLBYTES;
1342 #endif
1343                 if (so->so_snd.sb_hiwat < mss)
1344                         mss = so->so_snd.sb_hiwat;
1345
1346                 tp->t_maxseg = mss;
1347
1348                 tcpstat.tcps_mturesent++;
1349                 tp->t_rtttime = 0;
1350                 tp->snd_nxt = tp->snd_una;
1351                 tcp_output(tp);
1352         }
1353 }
1354
1355 /*
1356  * Look-up the routing entry to the peer of this inpcb.  If no route
1357  * is found and it cannot be allocated the return NULL.  This routine
1358  * is called by TCP routines that access the rmx structure and by tcp_mss
1359  * to get the interface MTU.
1360  */
1361 struct rtentry *
1362 tcp_rtlookup(inc)
1363         struct in_conninfo *inc;
1364 {
1365         struct route *ro;
1366         struct rtentry *rt;
1367
1368         ro = &inc->inc_route;
1369         rt = ro->ro_rt;
1370         if (rt == NULL || !(rt->rt_flags & RTF_UP)) {
1371                 /* No route yet, so try to acquire one */
1372                 if (inc->inc_faddr.s_addr != INADDR_ANY) {
1373                         ro->ro_dst.sa_family = AF_INET;
1374                         ro->ro_dst.sa_len = sizeof(struct sockaddr_in);
1375                         ((struct sockaddr_in *) &ro->ro_dst)->sin_addr =
1376                             inc->inc_faddr;
1377                         rtalloc(ro);
1378                         rt = ro->ro_rt;
1379                 }
1380         }
1381         return rt;
1382 }
1383
1384 #ifdef INET6
1385 struct rtentry *
1386 tcp_rtlookup6(inc)
1387         struct in_conninfo *inc;
1388 {
1389         struct route_in6 *ro6;
1390         struct rtentry *rt;
1391
1392         ro6 = &inc->inc6_route;
1393         rt = ro6->ro_rt;
1394         if (rt == NULL || !(rt->rt_flags & RTF_UP)) {
1395                 /* No route yet, so try to acquire one */
1396                 if (!IN6_IS_ADDR_UNSPECIFIED(&inc->inc6_faddr)) {
1397                         ro6->ro_dst.sin6_family = AF_INET6;
1398                         ro6->ro_dst.sin6_len = sizeof(struct sockaddr_in6);
1399                         ro6->ro_dst.sin6_addr = inc->inc6_faddr;
1400                         rtalloc((struct route *)ro6);
1401                         rt = ro6->ro_rt;
1402                 }
1403         }
1404         return rt;
1405 }
1406 #endif /* INET6 */
1407
1408 #ifdef IPSEC
1409 /* compute ESP/AH header size for TCP, including outer IP header. */
1410 size_t
1411 ipsec_hdrsiz_tcp(tp)
1412         struct tcpcb *tp;
1413 {
1414         struct inpcb *inp;
1415         struct mbuf *m;
1416         size_t hdrsiz;
1417         struct ip *ip;
1418 #ifdef INET6
1419         struct ip6_hdr *ip6;
1420 #endif /* INET6 */
1421         struct tcphdr *th;
1422
1423         if ((tp == NULL) || ((inp = tp->t_inpcb) == NULL))
1424                 return 0;
1425         MGETHDR(m, M_DONTWAIT, MT_DATA);
1426         if (!m)
1427                 return 0;
1428
1429 #ifdef INET6
1430         if ((inp->inp_vflag & INP_IPV6) != 0) {
1431                 ip6 = mtod(m, struct ip6_hdr *);
1432                 th = (struct tcphdr *)(ip6 + 1);
1433                 m->m_pkthdr.len = m->m_len =
1434                         sizeof(struct ip6_hdr) + sizeof(struct tcphdr);
1435                 tcp_fillheaders(tp, ip6, th);
1436                 hdrsiz = ipsec6_hdrsiz(m, IPSEC_DIR_OUTBOUND, inp);
1437         } else
1438 #endif /* INET6 */
1439       {
1440         ip = mtod(m, struct ip *);
1441         th = (struct tcphdr *)(ip + 1);
1442         m->m_pkthdr.len = m->m_len = sizeof(struct tcpiphdr);
1443         tcp_fillheaders(tp, ip, th);
1444         hdrsiz = ipsec4_hdrsiz(m, IPSEC_DIR_OUTBOUND, inp);
1445       }
1446
1447         m_free(m);
1448         return hdrsiz;
1449 }
1450 #endif /*IPSEC*/
1451
1452 /*
1453  * Return a pointer to the cached information about the remote host.
1454  * The cached information is stored in the protocol specific part of
1455  * the route metrics.
1456  */
1457 struct rmxp_tao *
1458 tcp_gettaocache(inc)
1459         struct in_conninfo *inc;
1460 {
1461         struct rtentry *rt;
1462
1463 #ifdef INET6
1464         if (inc->inc_isipv6)
1465                 rt = tcp_rtlookup6(inc);
1466         else
1467 #endif /* INET6 */
1468         rt = tcp_rtlookup(inc);
1469
1470         /* Make sure this is a host route and is up. */
1471         if (rt == NULL ||
1472             (rt->rt_flags & (RTF_UP|RTF_HOST)) != (RTF_UP|RTF_HOST))
1473                 return NULL;
1474
1475         return rmx_taop(rt->rt_rmx);
1476 }
1477
1478 /*
1479  * Clear all the TAO cache entries, called from tcp_init.
1480  *
1481  * XXX
1482  * This routine is just an empty one, because we assume that the routing
1483  * routing tables are initialized at the same time when TCP, so there is
1484  * nothing in the cache left over.
1485  */
1486 static void
1487 tcp_cleartaocache()
1488 {
1489 }
1490
1491 /*
1492  * TCP BANDWIDTH DELAY PRODUCT WINDOW LIMITING
1493  *
1494  * This code attempts to calculate the bandwidth-delay product as a
1495  * means of determining the optimal window size to maximize bandwidth,
1496  * minimize RTT, and avoid the over-allocation of buffers on interfaces and
1497  * routers.  This code also does a fairly good job keeping RTTs in check
1498  * across slow links like modems.  We implement an algorithm which is very
1499  * similar (but not meant to be) TCP/Vegas.  The code operates on the
1500  * transmitter side of a TCP connection and so only effects the transmit
1501  * side of the connection.
1502  *
1503  * BACKGROUND:  TCP makes no provision for the management of buffer space
1504  * at the end points or at the intermediate routers and switches.  A TCP 
1505  * stream, whether using NewReno or not, will eventually buffer as
1506  * many packets as it is able and the only reason this typically works is
1507  * due to the fairly small default buffers made available for a connection
1508  * (typicaly 16K or 32K).  As machines use larger windows and/or window
1509  * scaling it is now fairly easy for even a single TCP connection to blow-out
1510  * all available buffer space not only on the local interface, but on 
1511  * intermediate routers and switches as well.  NewReno makes a misguided
1512  * attempt to 'solve' this problem by waiting for an actual failure to occur,
1513  * then backing off, then steadily increasing the window again until another
1514  * failure occurs, ad-infinitum.  This results in terrible oscillation that
1515  * is only made worse as network loads increase and the idea of intentionally
1516  * blowing out network buffers is, frankly, a terrible way to manage network
1517  * resources.
1518  *
1519  * It is far better to limit the transmit window prior to the failure
1520  * condition being achieved.  There are two general ways to do this:  First
1521  * you can 'scan' through different transmit window sizes and locate the
1522  * point where the RTT stops increasing, indicating that you have filled the
1523  * pipe, then scan backwards until you note that RTT stops decreasing, then
1524  * repeat ad-infinitum.  This method works in principle but has severe
1525  * implementation issues due to RTT variances, timer granularity, and
1526  * instability in the algorithm which can lead to many false positives and
1527  * create oscillations as well as interact badly with other TCP streams
1528  * implementing the same algorithm.
1529  *
1530  * The second method is to limit the window to the bandwidth delay product
1531  * of the link.  This is the method we implement.  RTT variances and our
1532  * own manipulation of the congestion window, bwnd, can potentially 
1533  * destabilize the algorithm.  For this reason we have to stabilize the
1534  * elements used to calculate the window.  We do this by using the minimum
1535  * observed RTT, the long term average of the observed bandwidth, and
1536  * by adding two segments worth of slop.  It isn't perfect but it is able
1537  * to react to changing conditions and gives us a very stable basis on
1538  * which to extend the algorithm.
1539  */
1540 void
1541 tcp_xmit_bandwidth_limit(struct tcpcb *tp, tcp_seq ack_seq)
1542 {
1543         u_long bw;
1544         u_long bwnd;
1545         int save_ticks;
1546
1547         /*
1548          * If inflight_enable is disabled in the middle of a tcp connection,
1549          * make sure snd_bwnd is effectively disabled.
1550          */
1551         if (tcp_inflight_enable == 0) {
1552                 tp->snd_bwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT;
1553                 tp->snd_bandwidth = 0;
1554                 return;
1555         }
1556
1557         /*
1558          * Figure out the bandwidth.  Due to the tick granularity this
1559          * is a very rough number and it MUST be averaged over a fairly
1560          * long period of time.  XXX we need to take into account a link
1561          * that is not using all available bandwidth, but for now our
1562          * slop will ramp us up if this case occurs and the bandwidth later
1563          * increases.
1564          *
1565          * Note: if ticks rollover 'bw' may wind up negative.  We must
1566          * effectively reset t_bw_rtttime for this case.
1567          */
1568         save_ticks = ticks;
1569         if ((u_int)(save_ticks - tp->t_bw_rtttime) < 1)
1570                 return;
1571
1572         bw = (int64_t)(ack_seq - tp->t_bw_rtseq) * hz / 
1573             (save_ticks - tp->t_bw_rtttime);
1574         tp->t_bw_rtttime = save_ticks;
1575         tp->t_bw_rtseq = ack_seq;
1576         if (tp->t_bw_rtttime == 0 || (int)bw < 0)
1577                 return;
1578         bw = ((int64_t)tp->snd_bandwidth * 15 + bw) >> 4;
1579
1580         tp->snd_bandwidth = bw;
1581
1582         /*
1583          * Calculate the semi-static bandwidth delay product, plus two maximal
1584          * segments.  The additional slop puts us squarely in the sweet
1585          * spot and also handles the bandwidth run-up case.  Without the
1586          * slop we could be locking ourselves into a lower bandwidth.
1587          *
1588          * Situations Handled:
1589          *      (1) Prevents over-queueing of packets on LANs, especially on
1590          *          high speed LANs, allowing larger TCP buffers to be
1591          *          specified, and also does a good job preventing 
1592          *          over-queueing of packets over choke points like modems
1593          *          (at least for the transmit side).
1594          *
1595          *      (2) Is able to handle changing network loads (bandwidth
1596          *          drops so bwnd drops, bandwidth increases so bwnd
1597          *          increases).
1598          *
1599          *      (3) Theoretically should stabilize in the face of multiple
1600          *          connections implementing the same algorithm (this may need
1601          *          a little work).
1602          *
1603          *      (4) Stability value (defaults to 20 = 2 maximal packets) can 
1604          *          be adjusted with a sysctl but typically only needs to be on
1605          *          very slow connections.  A value no smaller then 5 should
1606          *          be used, but only reduce this default if you have no other
1607          *          choice.
1608          */
1609 #define USERTT  ((tp->t_srtt + tp->t_rttbest) / 2)
1610         bwnd = (int64_t)bw * USERTT / (hz << TCP_RTT_SHIFT) + tcp_inflight_stab * (int)tp->t_maxseg / 10;
1611 #undef USERTT
1612
1613         if (tcp_inflight_debug > 0) {
1614                 static int ltime;
1615                 if ((u_int)(ticks - ltime) >= hz / tcp_inflight_debug) {
1616                         ltime = ticks;
1617                         printf("%p bw %ld rttbest %d srtt %d bwnd %ld\n",
1618                             tp,
1619                             bw,
1620                             tp->t_rttbest,
1621                             tp->t_srtt,
1622                             bwnd
1623                         );
1624                 }
1625         }
1626         if ((long)bwnd < tcp_inflight_min)
1627                 bwnd = tcp_inflight_min;
1628         if (bwnd > tcp_inflight_max)
1629                 bwnd = tcp_inflight_max;
1630         if ((long)bwnd < tp->t_maxseg * 2)
1631                 bwnd = tp->t_maxseg * 2;
1632         tp->snd_bwnd = bwnd;
1633 }