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