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 * 4. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)tcp_subr.c 8.2 (Berkeley) 5/24/95 30 */ 31 32 #include <sys/cdefs.h> 33 __FBSDID("$FreeBSD$"); 34 35 #include "opt_compat.h" 36 #include "opt_inet.h" 37 #include "opt_inet6.h" 38 #include "opt_ipsec.h" 39 #include "opt_tcpdebug.h" 40 41 #include <sys/param.h> 42 #include <sys/systm.h> 43 #include <sys/callout.h> 44 #include <sys/kernel.h> 45 #include <sys/sysctl.h> 46 #include <sys/jail.h> 47 #include <sys/malloc.h> 48 #include <sys/mbuf.h> 49 #ifdef INET6 50 #include <sys/domain.h> 51 #endif 52 #include <sys/priv.h> 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 59 #include <vm/uma.h> 60 61 #include <net/route.h> 62 #include <net/if.h> 63 #include <net/vnet.h> 64 65 #include <netinet/in.h> 66 #include <netinet/in_systm.h> 67 #include <netinet/ip.h> 68 #ifdef INET6 69 #include <netinet/ip6.h> 70 #endif 71 #include <netinet/in_pcb.h> 72 #ifdef INET6 73 #include <netinet6/in6_pcb.h> 74 #endif 75 #include <netinet/in_var.h> 76 #include <netinet/ip_var.h> 77 #ifdef INET6 78 #include <netinet6/ip6_var.h> 79 #include <netinet6/scope6_var.h> 80 #include <netinet6/nd6.h> 81 #endif 82 #include <netinet/ip_icmp.h> 83 #include <netinet/tcp.h> 84 #include <netinet/tcp_fsm.h> 85 #include <netinet/tcp_seq.h> 86 #include <netinet/tcp_timer.h> 87 #include <netinet/tcp_var.h> 88 #include <netinet/tcp_syncache.h> 89 #include <netinet/tcp_offload.h> 90 #ifdef INET6 91 #include <netinet6/tcp6_var.h> 92 #endif 93 #include <netinet/tcpip.h> 94 #ifdef TCPDEBUG 95 #include <netinet/tcp_debug.h> 96 #endif 97 #include <netinet6/ip6protosw.h> 98 99 #ifdef IPSEC 100 #include <netipsec/ipsec.h> 101 #include <netipsec/xform.h> 102 #ifdef INET6 103 #include <netipsec/ipsec6.h> 104 #endif 105 #include <netipsec/key.h> 106 #include <sys/syslog.h> 107 #endif /*IPSEC*/ 108 109 #include <machine/in_cksum.h> 110 #include <sys/md5.h> 111 112 #include <security/mac/mac_framework.h> 113 114 VNET_DEFINE(int, tcp_mssdflt); 115 #ifdef INET6 116 VNET_DEFINE(int, tcp_v6mssdflt); 117 #endif 118 VNET_DEFINE(int, tcp_minmss); 119 VNET_DEFINE(int, tcp_do_rfc1323); 120 121 static VNET_DEFINE(int, icmp_may_rst); 122 static VNET_DEFINE(int, tcp_isn_reseed_interval); 123 static VNET_DEFINE(int, tcp_inflight_enable); 124 static VNET_DEFINE(int, tcp_inflight_rttthresh); 125 static VNET_DEFINE(int, tcp_inflight_min); 126 static VNET_DEFINE(int, tcp_inflight_max); 127 static VNET_DEFINE(int, tcp_inflight_stab); 128 129 #define V_icmp_may_rst VNET(icmp_may_rst) 130 #define V_tcp_isn_reseed_interval VNET(tcp_isn_reseed_interval) 131 #define V_tcp_inflight_enable VNET(tcp_inflight_enable) 132 #define V_tcp_inflight_rttthresh VNET(tcp_inflight_rttthresh) 133 #define V_tcp_inflight_min VNET(tcp_inflight_min) 134 #define V_tcp_inflight_max VNET(tcp_inflight_max) 135 #define V_tcp_inflight_stab VNET(tcp_inflight_stab) 136 137 static int 138 sysctl_net_inet_tcp_mss_check(SYSCTL_HANDLER_ARGS) 139 { 140 int error, new; 141 142 new = V_tcp_mssdflt; 143 error = sysctl_handle_int(oidp, &new, 0, req); 144 if (error == 0 && req->newptr) { 145 if (new < TCP_MINMSS) 146 error = EINVAL; 147 else 148 V_tcp_mssdflt = new; 149 } 150 return (error); 151 } 152 153 SYSCTL_VNET_PROC(_net_inet_tcp, TCPCTL_MSSDFLT, mssdflt, 154 CTLTYPE_INT|CTLFLAG_RW, &VNET_NAME(tcp_mssdflt), 0, 155 &sysctl_net_inet_tcp_mss_check, "I", 156 "Default TCP Maximum Segment Size"); 157 158 #ifdef INET6 159 static int 160 sysctl_net_inet_tcp_mss_v6_check(SYSCTL_HANDLER_ARGS) 161 { 162 int error, new; 163 164 new = V_tcp_v6mssdflt; 165 error = sysctl_handle_int(oidp, &new, 0, req); 166 if (error == 0 && req->newptr) { 167 if (new < TCP_MINMSS) 168 error = EINVAL; 169 else 170 V_tcp_v6mssdflt = new; 171 } 172 return (error); 173 } 174 175 SYSCTL_VNET_PROC(_net_inet_tcp, TCPCTL_V6MSSDFLT, v6mssdflt, 176 CTLTYPE_INT|CTLFLAG_RW, &VNET_NAME(tcp_v6mssdflt), 0, 177 &sysctl_net_inet_tcp_mss_v6_check, "I", 178 "Default TCP Maximum Segment Size for IPv6"); 179 #endif 180 181 static int 182 vnet_sysctl_msec_to_ticks(SYSCTL_HANDLER_ARGS) 183 { 184 185 VNET_SYSCTL_ARG(req, arg1); 186 return (sysctl_msec_to_ticks(oidp, arg1, arg2, req)); 187 } 188 189 /* 190 * Minimum MSS we accept and use. This prevents DoS attacks where 191 * we are forced to a ridiculous low MSS like 20 and send hundreds 192 * of packets instead of one. The effect scales with the available 193 * bandwidth and quickly saturates the CPU and network interface 194 * with packet generation and sending. Set to zero to disable MINMSS 195 * checking. This setting prevents us from sending too small packets. 196 */ 197 SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, minmss, CTLFLAG_RW, 198 &VNET_NAME(tcp_minmss), 0, 199 "Minmum TCP Maximum Segment Size"); 200 201 SYSCTL_VNET_INT(_net_inet_tcp, TCPCTL_DO_RFC1323, rfc1323, CTLFLAG_RW, 202 &VNET_NAME(tcp_do_rfc1323), 0, 203 "Enable rfc1323 (high performance TCP) extensions"); 204 205 static int tcp_log_debug = 0; 206 SYSCTL_INT(_net_inet_tcp, OID_AUTO, log_debug, CTLFLAG_RW, 207 &tcp_log_debug, 0, "Log errors caused by incoming TCP segments"); 208 209 static int tcp_tcbhashsize = 0; 210 SYSCTL_INT(_net_inet_tcp, OID_AUTO, tcbhashsize, CTLFLAG_RDTUN, 211 &tcp_tcbhashsize, 0, "Size of TCP control-block hashtable"); 212 213 static int do_tcpdrain = 1; 214 SYSCTL_INT(_net_inet_tcp, OID_AUTO, do_tcpdrain, CTLFLAG_RW, &do_tcpdrain, 0, 215 "Enable tcp_drain routine for extra help when low on mbufs"); 216 217 SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, pcbcount, CTLFLAG_RD, 218 &VNET_NAME(tcbinfo.ipi_count), 0, "Number of active PCBs"); 219 220 SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, icmp_may_rst, CTLFLAG_RW, 221 &VNET_NAME(icmp_may_rst), 0, 222 "Certain ICMP unreachable messages may abort connections in SYN_SENT"); 223 224 SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, isn_reseed_interval, CTLFLAG_RW, 225 &VNET_NAME(tcp_isn_reseed_interval), 0, 226 "Seconds between reseeding of ISN secret"); 227 228 /* 229 * TCP bandwidth limiting sysctls. Note that the default lower bound of 230 * 1024 exists only for debugging. A good production default would be 231 * something like 6100. 232 */ 233 SYSCTL_NODE(_net_inet_tcp, OID_AUTO, inflight, CTLFLAG_RW, 0, 234 "TCP inflight data limiting"); 235 236 SYSCTL_VNET_INT(_net_inet_tcp_inflight, OID_AUTO, enable, CTLFLAG_RW, 237 &VNET_NAME(tcp_inflight_enable), 0, 238 "Enable automatic TCP inflight data limiting"); 239 240 static int tcp_inflight_debug = 0; 241 SYSCTL_INT(_net_inet_tcp_inflight, OID_AUTO, debug, CTLFLAG_RW, 242 &tcp_inflight_debug, 0, 243 "Debug TCP inflight calculations"); 244 245 SYSCTL_VNET_PROC(_net_inet_tcp_inflight, OID_AUTO, rttthresh, 246 CTLTYPE_INT|CTLFLAG_RW, &VNET_NAME(tcp_inflight_rttthresh), 0, 247 vnet_sysctl_msec_to_ticks, "I", 248 "RTT threshold below which inflight will deactivate itself"); 249 250 SYSCTL_VNET_INT(_net_inet_tcp_inflight, OID_AUTO, min, CTLFLAG_RW, 251 &VNET_NAME(tcp_inflight_min), 0, 252 "Lower-bound for TCP inflight window"); 253 254 SYSCTL_VNET_INT(_net_inet_tcp_inflight, OID_AUTO, max, CTLFLAG_RW, 255 &VNET_NAME(tcp_inflight_max), 0, 256 "Upper-bound for TCP inflight window"); 257 258 SYSCTL_VNET_INT(_net_inet_tcp_inflight, OID_AUTO, stab, CTLFLAG_RW, 259 &VNET_NAME(tcp_inflight_stab), 0, 260 "Inflight Algorithm Stabilization 20 = 2 packets"); 261 262 VNET_DEFINE(uma_zone_t, sack_hole_zone); 263 #define V_sack_hole_zone VNET(sack_hole_zone) 264 265 static struct inpcb *tcp_notify(struct inpcb *, int); 266 static void tcp_isn_tick(void *); 267 268 /* 269 * Target size of TCP PCB hash tables. Must be a power of two. 270 * 271 * Note that this can be overridden by the kernel environment 272 * variable net.inet.tcp.tcbhashsize 273 */ 274 #ifndef TCBHASHSIZE 275 #define TCBHASHSIZE 512 276 #endif 277 278 /* 279 * XXX 280 * Callouts should be moved into struct tcp directly. They are currently 281 * separate because the tcpcb structure is exported to userland for sysctl 282 * parsing purposes, which do not know about callouts. 283 */ 284 struct tcpcb_mem { 285 struct tcpcb tcb; 286 struct tcp_timer tt; 287 }; 288 289 static VNET_DEFINE(uma_zone_t, tcpcb_zone); 290 #define V_tcpcb_zone VNET(tcpcb_zone) 291 292 MALLOC_DEFINE(M_TCPLOG, "tcplog", "TCP address and flags print buffers"); 293 struct callout isn_callout; 294 static struct mtx isn_mtx; 295 296 #define ISN_LOCK_INIT() mtx_init(&isn_mtx, "isn_mtx", NULL, MTX_DEF) 297 #define ISN_LOCK() mtx_lock(&isn_mtx) 298 #define ISN_UNLOCK() mtx_unlock(&isn_mtx) 299 300 /* 301 * TCP initialization. 302 */ 303 static void 304 tcp_zone_change(void *tag) 305 { 306 307 uma_zone_set_max(V_tcbinfo.ipi_zone, maxsockets); 308 uma_zone_set_max(V_tcpcb_zone, maxsockets); 309 tcp_tw_zone_change(); 310 } 311 312 static int 313 tcp_inpcb_init(void *mem, int size, int flags) 314 { 315 struct inpcb *inp = mem; 316 317 INP_LOCK_INIT(inp, "inp", "tcpinp"); 318 return (0); 319 } 320 321 void 322 tcp_init(void) 323 { 324 int hashsize; 325 326 V_blackhole = 0; 327 V_tcp_delack_enabled = 1; 328 V_drop_synfin = 0; 329 V_tcp_do_rfc3042 = 1; 330 V_tcp_do_rfc3390 = 1; 331 V_tcp_do_ecn = 0; 332 V_tcp_ecn_maxretries = 1; 333 V_tcp_insecure_rst = 0; 334 V_tcp_do_autorcvbuf = 1; 335 V_tcp_autorcvbuf_inc = 16*1024; 336 V_tcp_autorcvbuf_max = 256*1024; 337 V_tcp_do_rfc3465 = 1; 338 V_tcp_abc_l_var = 2; 339 340 V_tcp_mssdflt = TCP_MSS; 341 #ifdef INET6 342 V_tcp_v6mssdflt = TCP6_MSS; 343 #endif 344 V_tcp_minmss = TCP_MINMSS; 345 V_tcp_do_rfc1323 = 1; 346 V_icmp_may_rst = 1; 347 V_tcp_isn_reseed_interval = 0; 348 V_tcp_inflight_enable = 1; 349 V_tcp_inflight_min = 6144; 350 V_tcp_inflight_max = TCP_MAXWIN << TCP_MAX_WINSHIFT; 351 V_tcp_inflight_stab = 20; 352 353 V_path_mtu_discovery = 1; 354 V_ss_fltsz = 1; 355 V_ss_fltsz_local = 4; 356 V_tcp_do_newreno = 1; 357 V_tcp_do_tso = 1; 358 V_tcp_do_autosndbuf = 1; 359 V_tcp_autosndbuf_inc = 8*1024; 360 V_tcp_autosndbuf_max = 256*1024; 361 362 V_nolocaltimewait = 0; 363 364 V_tcp_do_sack = 1; 365 V_tcp_sack_maxholes = 128; 366 V_tcp_sack_globalmaxholes = 65536; 367 V_tcp_sack_globalholes = 0; 368 369 V_tcp_inflight_rttthresh = TCPTV_INFLIGHT_RTTTHRESH; 370 371 TUNABLE_INT_FETCH("net.inet.tcp.sack.enable", &V_tcp_do_sack); 372 373 INP_INFO_LOCK_INIT(&V_tcbinfo, "tcp"); 374 LIST_INIT(&V_tcb); 375 #ifdef VIMAGE 376 V_tcbinfo.ipi_vnet = curvnet; 377 #endif 378 V_tcbinfo.ipi_listhead = &V_tcb; 379 hashsize = TCBHASHSIZE; 380 TUNABLE_INT_FETCH("net.inet.tcp.tcbhashsize", &hashsize); 381 if (!powerof2(hashsize)) { 382 printf("WARNING: TCB hash size not a power of 2\n"); 383 hashsize = 512; /* safe default */ 384 } 385 V_tcbinfo.ipi_hashbase = hashinit(hashsize, M_PCB, 386 &V_tcbinfo.ipi_hashmask); 387 V_tcbinfo.ipi_porthashbase = hashinit(hashsize, M_PCB, 388 &V_tcbinfo.ipi_porthashmask); 389 V_tcbinfo.ipi_zone = uma_zcreate("tcp_inpcb", sizeof(struct inpcb), 390 NULL, NULL, tcp_inpcb_init, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE); 391 uma_zone_set_max(V_tcbinfo.ipi_zone, maxsockets); 392 /* 393 * These have to be type stable for the benefit of the timers. 394 */ 395 V_tcpcb_zone = uma_zcreate("tcpcb", sizeof(struct tcpcb_mem), 396 NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE); 397 uma_zone_set_max(V_tcpcb_zone, maxsockets); 398 tcp_tw_init(); 399 syncache_init(); 400 tcp_hc_init(); 401 tcp_reass_init(); 402 V_sack_hole_zone = uma_zcreate("sackhole", sizeof(struct sackhole), 403 NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE); 404 405 /* Skip initialization of globals for non-default instances. */ 406 if (!IS_DEFAULT_VNET(curvnet)) 407 return; 408 409 /* XXX virtualize those bellow? */ 410 tcp_delacktime = TCPTV_DELACK; 411 tcp_keepinit = TCPTV_KEEP_INIT; 412 tcp_keepidle = TCPTV_KEEP_IDLE; 413 tcp_keepintvl = TCPTV_KEEPINTVL; 414 tcp_maxpersistidle = TCPTV_KEEP_IDLE; 415 tcp_msl = TCPTV_MSL; 416 tcp_rexmit_min = TCPTV_MIN; 417 if (tcp_rexmit_min < 1) 418 tcp_rexmit_min = 1; 419 tcp_rexmit_slop = TCPTV_CPU_VAR; 420 tcp_finwait2_timeout = TCPTV_FINWAIT2_TIMEOUT; 421 tcp_tcbhashsize = hashsize; 422 423 #ifdef INET6 424 #define TCP_MINPROTOHDR (sizeof(struct ip6_hdr) + sizeof(struct tcphdr)) 425 #else /* INET6 */ 426 #define TCP_MINPROTOHDR (sizeof(struct tcpiphdr)) 427 #endif /* INET6 */ 428 if (max_protohdr < TCP_MINPROTOHDR) 429 max_protohdr = TCP_MINPROTOHDR; 430 if (max_linkhdr + TCP_MINPROTOHDR > MHLEN) 431 panic("tcp_init"); 432 #undef TCP_MINPROTOHDR 433 434 ISN_LOCK_INIT(); 435 callout_init(&isn_callout, CALLOUT_MPSAFE); 436 callout_reset(&isn_callout, hz/100, tcp_isn_tick, NULL); 437 EVENTHANDLER_REGISTER(shutdown_pre_sync, tcp_fini, NULL, 438 SHUTDOWN_PRI_DEFAULT); 439 EVENTHANDLER_REGISTER(maxsockets_change, tcp_zone_change, NULL, 440 EVENTHANDLER_PRI_ANY); 441 } 442 443 #ifdef VIMAGE 444 void 445 tcp_destroy(void) 446 { 447 448 tcp_tw_destroy(); 449 tcp_hc_destroy(); 450 syncache_destroy(); 451 452 /* XXX check that hashes are empty! */ 453 hashdestroy(V_tcbinfo.ipi_hashbase, M_PCB, 454 V_tcbinfo.ipi_hashmask); 455 hashdestroy(V_tcbinfo.ipi_porthashbase, M_PCB, 456 V_tcbinfo.ipi_porthashmask); 457 INP_INFO_LOCK_DESTROY(&V_tcbinfo); 458 } 459 #endif 460 461 void 462 tcp_fini(void *xtp) 463 { 464 465 callout_stop(&isn_callout); 466 } 467 468 /* 469 * Fill in the IP and TCP headers for an outgoing packet, given the tcpcb. 470 * tcp_template used to store this data in mbufs, but we now recopy it out 471 * of the tcpcb each time to conserve mbufs. 472 */ 473 void 474 tcpip_fillheaders(struct inpcb *inp, void *ip_ptr, void *tcp_ptr) 475 { 476 struct tcphdr *th = (struct tcphdr *)tcp_ptr; 477 478 INP_WLOCK_ASSERT(inp); 479 480 #ifdef INET6 481 if ((inp->inp_vflag & INP_IPV6) != 0) { 482 struct ip6_hdr *ip6; 483 484 ip6 = (struct ip6_hdr *)ip_ptr; 485 ip6->ip6_flow = (ip6->ip6_flow & ~IPV6_FLOWINFO_MASK) | 486 (inp->inp_flow & IPV6_FLOWINFO_MASK); 487 ip6->ip6_vfc = (ip6->ip6_vfc & ~IPV6_VERSION_MASK) | 488 (IPV6_VERSION & IPV6_VERSION_MASK); 489 ip6->ip6_nxt = IPPROTO_TCP; 490 ip6->ip6_plen = htons(sizeof(struct tcphdr)); 491 ip6->ip6_src = inp->in6p_laddr; 492 ip6->ip6_dst = inp->in6p_faddr; 493 } else 494 #endif 495 { 496 struct ip *ip; 497 498 ip = (struct ip *)ip_ptr; 499 ip->ip_v = IPVERSION; 500 ip->ip_hl = 5; 501 ip->ip_tos = inp->inp_ip_tos; 502 ip->ip_len = 0; 503 ip->ip_id = 0; 504 ip->ip_off = 0; 505 ip->ip_ttl = inp->inp_ip_ttl; 506 ip->ip_sum = 0; 507 ip->ip_p = IPPROTO_TCP; 508 ip->ip_src = inp->inp_laddr; 509 ip->ip_dst = inp->inp_faddr; 510 } 511 th->th_sport = inp->inp_lport; 512 th->th_dport = inp->inp_fport; 513 th->th_seq = 0; 514 th->th_ack = 0; 515 th->th_x2 = 0; 516 th->th_off = 5; 517 th->th_flags = 0; 518 th->th_win = 0; 519 th->th_urp = 0; 520 th->th_sum = 0; /* in_pseudo() is called later for ipv4 */ 521 } 522 523 /* 524 * Create template to be used to send tcp packets on a connection. 525 * Allocates an mbuf and fills in a skeletal tcp/ip header. The only 526 * use for this function is in keepalives, which use tcp_respond. 527 */ 528 struct tcptemp * 529 tcpip_maketemplate(struct inpcb *inp) 530 { 531 struct tcptemp *t; 532 533 t = malloc(sizeof(*t), M_TEMP, M_NOWAIT); 534 if (t == NULL) 535 return (NULL); 536 tcpip_fillheaders(inp, (void *)&t->tt_ipgen, (void *)&t->tt_t); 537 return (t); 538 } 539 540 /* 541 * Send a single message to the TCP at address specified by 542 * the given TCP/IP header. If m == NULL, then we make a copy 543 * of the tcpiphdr at ti and send directly to the addressed host. 544 * This is used to force keep alive messages out using the TCP 545 * template for a connection. If flags are given then we send 546 * a message back to the TCP which originated the * segment ti, 547 * and discard the mbuf containing it and any other attached mbufs. 548 * 549 * In any case the ack and sequence number of the transmitted 550 * segment are as specified by the parameters. 551 * 552 * NOTE: If m != NULL, then ti must point to *inside* the mbuf. 553 */ 554 void 555 tcp_respond(struct tcpcb *tp, void *ipgen, struct tcphdr *th, struct mbuf *m, 556 tcp_seq ack, tcp_seq seq, int flags) 557 { 558 int tlen; 559 int win = 0; 560 struct ip *ip; 561 struct tcphdr *nth; 562 #ifdef INET6 563 struct ip6_hdr *ip6; 564 int isipv6; 565 #endif /* INET6 */ 566 int ipflags = 0; 567 struct inpcb *inp; 568 569 KASSERT(tp != NULL || m != NULL, ("tcp_respond: tp and m both NULL")); 570 571 #ifdef INET6 572 isipv6 = ((struct ip *)ipgen)->ip_v == 6; 573 ip6 = ipgen; 574 #endif /* INET6 */ 575 ip = ipgen; 576 577 if (tp != NULL) { 578 inp = tp->t_inpcb; 579 KASSERT(inp != NULL, ("tcp control block w/o inpcb")); 580 INP_WLOCK_ASSERT(inp); 581 } else 582 inp = NULL; 583 584 if (tp != NULL) { 585 if (!(flags & TH_RST)) { 586 win = sbspace(&inp->inp_socket->so_rcv); 587 if (win > (long)TCP_MAXWIN << tp->rcv_scale) 588 win = (long)TCP_MAXWIN << tp->rcv_scale; 589 } 590 } 591 if (m == NULL) { 592 m = m_gethdr(M_DONTWAIT, MT_DATA); 593 if (m == NULL) 594 return; 595 tlen = 0; 596 m->m_data += max_linkhdr; 597 #ifdef INET6 598 if (isipv6) { 599 bcopy((caddr_t)ip6, mtod(m, caddr_t), 600 sizeof(struct ip6_hdr)); 601 ip6 = mtod(m, struct ip6_hdr *); 602 nth = (struct tcphdr *)(ip6 + 1); 603 } else 604 #endif /* INET6 */ 605 { 606 bcopy((caddr_t)ip, mtod(m, caddr_t), sizeof(struct ip)); 607 ip = mtod(m, struct ip *); 608 nth = (struct tcphdr *)(ip + 1); 609 } 610 bcopy((caddr_t)th, (caddr_t)nth, sizeof(struct tcphdr)); 611 flags = TH_ACK; 612 } else { 613 /* 614 * reuse the mbuf. 615 * XXX MRT We inherrit the FIB, which is lucky. 616 */ 617 m_freem(m->m_next); 618 m->m_next = NULL; 619 m->m_data = (caddr_t)ipgen; 620 /* m_len is set later */ 621 tlen = 0; 622 #define xchg(a,b,type) { type t; t=a; a=b; b=t; } 623 #ifdef INET6 624 if (isipv6) { 625 xchg(ip6->ip6_dst, ip6->ip6_src, struct in6_addr); 626 nth = (struct tcphdr *)(ip6 + 1); 627 } else 628 #endif /* INET6 */ 629 { 630 xchg(ip->ip_dst.s_addr, ip->ip_src.s_addr, uint32_t); 631 nth = (struct tcphdr *)(ip + 1); 632 } 633 if (th != nth) { 634 /* 635 * this is usually a case when an extension header 636 * exists between the IPv6 header and the 637 * TCP header. 638 */ 639 nth->th_sport = th->th_sport; 640 nth->th_dport = th->th_dport; 641 } 642 xchg(nth->th_dport, nth->th_sport, uint16_t); 643 #undef xchg 644 } 645 #ifdef INET6 646 if (isipv6) { 647 ip6->ip6_flow = 0; 648 ip6->ip6_vfc = IPV6_VERSION; 649 ip6->ip6_nxt = IPPROTO_TCP; 650 ip6->ip6_plen = htons((u_short)(sizeof (struct tcphdr) + 651 tlen)); 652 tlen += sizeof (struct ip6_hdr) + sizeof (struct tcphdr); 653 } else 654 #endif 655 { 656 tlen += sizeof (struct tcpiphdr); 657 ip->ip_len = tlen; 658 ip->ip_ttl = V_ip_defttl; 659 if (V_path_mtu_discovery) 660 ip->ip_off |= IP_DF; 661 } 662 m->m_len = tlen; 663 m->m_pkthdr.len = tlen; 664 m->m_pkthdr.rcvif = NULL; 665 #ifdef MAC 666 if (inp != NULL) { 667 /* 668 * Packet is associated with a socket, so allow the 669 * label of the response to reflect the socket label. 670 */ 671 INP_WLOCK_ASSERT(inp); 672 mac_inpcb_create_mbuf(inp, m); 673 } else { 674 /* 675 * Packet is not associated with a socket, so possibly 676 * update the label in place. 677 */ 678 mac_netinet_tcp_reply(m); 679 } 680 #endif 681 nth->th_seq = htonl(seq); 682 nth->th_ack = htonl(ack); 683 nth->th_x2 = 0; 684 nth->th_off = sizeof (struct tcphdr) >> 2; 685 nth->th_flags = flags; 686 if (tp != NULL) 687 nth->th_win = htons((u_short) (win >> tp->rcv_scale)); 688 else 689 nth->th_win = htons((u_short)win); 690 nth->th_urp = 0; 691 #ifdef INET6 692 if (isipv6) { 693 nth->th_sum = 0; 694 nth->th_sum = in6_cksum(m, IPPROTO_TCP, 695 sizeof(struct ip6_hdr), 696 tlen - sizeof(struct ip6_hdr)); 697 ip6->ip6_hlim = in6_selecthlim(tp != NULL ? tp->t_inpcb : 698 NULL, NULL); 699 } else 700 #endif /* INET6 */ 701 { 702 nth->th_sum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr, 703 htons((u_short)(tlen - sizeof(struct ip) + ip->ip_p))); 704 m->m_pkthdr.csum_flags = CSUM_TCP; 705 m->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum); 706 } 707 #ifdef TCPDEBUG 708 if (tp == NULL || (inp->inp_socket->so_options & SO_DEBUG)) 709 tcp_trace(TA_OUTPUT, 0, tp, mtod(m, void *), th, 0); 710 #endif 711 #ifdef INET6 712 if (isipv6) 713 (void) ip6_output(m, NULL, NULL, ipflags, NULL, NULL, inp); 714 else 715 #endif /* INET6 */ 716 (void) ip_output(m, NULL, NULL, ipflags, NULL, inp); 717 } 718 719 /* 720 * Create a new TCP control block, making an 721 * empty reassembly queue and hooking it to the argument 722 * protocol control block. The `inp' parameter must have 723 * come from the zone allocator set up in tcp_init(). 724 */ 725 struct tcpcb * 726 tcp_newtcpcb(struct inpcb *inp) 727 { 728 struct tcpcb_mem *tm; 729 struct tcpcb *tp; 730 #ifdef INET6 731 int isipv6 = (inp->inp_vflag & INP_IPV6) != 0; 732 #endif /* INET6 */ 733 734 tm = uma_zalloc(V_tcpcb_zone, M_NOWAIT | M_ZERO); 735 if (tm == NULL) 736 return (NULL); 737 tp = &tm->tcb; 738 #ifdef VIMAGE 739 tp->t_vnet = inp->inp_vnet; 740 #endif 741 tp->t_timers = &tm->tt; 742 /* LIST_INIT(&tp->t_segq); */ /* XXX covered by M_ZERO */ 743 tp->t_maxseg = tp->t_maxopd = 744 #ifdef INET6 745 isipv6 ? V_tcp_v6mssdflt : 746 #endif /* INET6 */ 747 V_tcp_mssdflt; 748 749 /* Set up our timeouts. */ 750 callout_init(&tp->t_timers->tt_rexmt, CALLOUT_MPSAFE); 751 callout_init(&tp->t_timers->tt_persist, CALLOUT_MPSAFE); 752 callout_init(&tp->t_timers->tt_keep, CALLOUT_MPSAFE); 753 callout_init(&tp->t_timers->tt_2msl, CALLOUT_MPSAFE); 754 callout_init(&tp->t_timers->tt_delack, CALLOUT_MPSAFE); 755 756 if (V_tcp_do_rfc1323) 757 tp->t_flags = (TF_REQ_SCALE|TF_REQ_TSTMP); 758 if (V_tcp_do_sack) 759 tp->t_flags |= TF_SACK_PERMIT; 760 TAILQ_INIT(&tp->snd_holes); 761 tp->t_inpcb = inp; /* XXX */ 762 /* 763 * Init srtt to TCPTV_SRTTBASE (0), so we can tell that we have no 764 * rtt estimate. Set rttvar so that srtt + 4 * rttvar gives 765 * reasonable initial retransmit time. 766 */ 767 tp->t_srtt = TCPTV_SRTTBASE; 768 tp->t_rttvar = ((TCPTV_RTOBASE - TCPTV_SRTTBASE) << TCP_RTTVAR_SHIFT) / 4; 769 tp->t_rttmin = tcp_rexmit_min; 770 tp->t_rxtcur = TCPTV_RTOBASE; 771 tp->snd_cwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT; 772 tp->snd_bwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT; 773 tp->snd_ssthresh = TCP_MAXWIN << TCP_MAX_WINSHIFT; 774 tp->t_rcvtime = ticks; 775 tp->t_bw_rtttime = ticks; 776 /* 777 * IPv4 TTL initialization is necessary for an IPv6 socket as well, 778 * because the socket may be bound to an IPv6 wildcard address, 779 * which may match an IPv4-mapped IPv6 address. 780 */ 781 inp->inp_ip_ttl = V_ip_defttl; 782 inp->inp_ppcb = tp; 783 return (tp); /* XXX */ 784 } 785 786 /* 787 * Drop a TCP connection, reporting 788 * the specified error. If connection is synchronized, 789 * then send a RST to peer. 790 */ 791 struct tcpcb * 792 tcp_drop(struct tcpcb *tp, int errno) 793 { 794 struct socket *so = tp->t_inpcb->inp_socket; 795 796 INP_INFO_WLOCK_ASSERT(&V_tcbinfo); 797 INP_WLOCK_ASSERT(tp->t_inpcb); 798 799 if (TCPS_HAVERCVDSYN(tp->t_state)) { 800 tp->t_state = TCPS_CLOSED; 801 (void) tcp_output_reset(tp); 802 TCPSTAT_INC(tcps_drops); 803 } else 804 TCPSTAT_INC(tcps_conndrops); 805 if (errno == ETIMEDOUT && tp->t_softerror) 806 errno = tp->t_softerror; 807 so->so_error = errno; 808 return (tcp_close(tp)); 809 } 810 811 void 812 tcp_discardcb(struct tcpcb *tp) 813 { 814 struct tseg_qent *q; 815 struct inpcb *inp = tp->t_inpcb; 816 struct socket *so = inp->inp_socket; 817 #ifdef INET6 818 int isipv6 = (inp->inp_vflag & INP_IPV6) != 0; 819 #endif /* INET6 */ 820 821 INP_WLOCK_ASSERT(inp); 822 823 /* 824 * Make sure that all of our timers are stopped before we 825 * delete the PCB. 826 */ 827 callout_stop(&tp->t_timers->tt_rexmt); 828 callout_stop(&tp->t_timers->tt_persist); 829 callout_stop(&tp->t_timers->tt_keep); 830 callout_stop(&tp->t_timers->tt_2msl); 831 callout_stop(&tp->t_timers->tt_delack); 832 833 /* 834 * If we got enough samples through the srtt filter, 835 * save the rtt and rttvar in the routing entry. 836 * 'Enough' is arbitrarily defined as 4 rtt samples. 837 * 4 samples is enough for the srtt filter to converge 838 * to within enough % of the correct value; fewer samples 839 * and we could save a bogus rtt. The danger is not high 840 * as tcp quickly recovers from everything. 841 * XXX: Works very well but needs some more statistics! 842 */ 843 if (tp->t_rttupdated >= 4) { 844 struct hc_metrics_lite metrics; 845 u_long ssthresh; 846 847 bzero(&metrics, sizeof(metrics)); 848 /* 849 * Update the ssthresh always when the conditions below 850 * are satisfied. This gives us better new start value 851 * for the congestion avoidance for new connections. 852 * ssthresh is only set if packet loss occured on a session. 853 * 854 * XXXRW: 'so' may be NULL here, and/or socket buffer may be 855 * being torn down. Ideally this code would not use 'so'. 856 */ 857 ssthresh = tp->snd_ssthresh; 858 if (ssthresh != 0 && ssthresh < so->so_snd.sb_hiwat / 2) { 859 /* 860 * convert the limit from user data bytes to 861 * packets then to packet data bytes. 862 */ 863 ssthresh = (ssthresh + tp->t_maxseg / 2) / tp->t_maxseg; 864 if (ssthresh < 2) 865 ssthresh = 2; 866 ssthresh *= (u_long)(tp->t_maxseg + 867 #ifdef INET6 868 (isipv6 ? sizeof (struct ip6_hdr) + 869 sizeof (struct tcphdr) : 870 #endif 871 sizeof (struct tcpiphdr) 872 #ifdef INET6 873 ) 874 #endif 875 ); 876 } else 877 ssthresh = 0; 878 metrics.rmx_ssthresh = ssthresh; 879 880 metrics.rmx_rtt = tp->t_srtt; 881 metrics.rmx_rttvar = tp->t_rttvar; 882 /* XXX: This wraps if the pipe is more than 4 Gbit per second */ 883 metrics.rmx_bandwidth = tp->snd_bandwidth; 884 metrics.rmx_cwnd = tp->snd_cwnd; 885 metrics.rmx_sendpipe = 0; 886 metrics.rmx_recvpipe = 0; 887 888 tcp_hc_update(&inp->inp_inc, &metrics); 889 } 890 891 /* free the reassembly queue, if any */ 892 while ((q = LIST_FIRST(&tp->t_segq)) != NULL) { 893 LIST_REMOVE(q, tqe_q); 894 m_freem(q->tqe_m); 895 uma_zfree(V_tcp_reass_zone, q); 896 tp->t_segqlen--; 897 V_tcp_reass_qsize--; 898 } 899 /* Disconnect offload device, if any. */ 900 tcp_offload_detach(tp); 901 902 tcp_free_sackholes(tp); 903 inp->inp_ppcb = NULL; 904 tp->t_inpcb = NULL; 905 uma_zfree(V_tcpcb_zone, tp); 906 } 907 908 /* 909 * Attempt to close a TCP control block, marking it as dropped, and freeing 910 * the socket if we hold the only reference. 911 */ 912 struct tcpcb * 913 tcp_close(struct tcpcb *tp) 914 { 915 struct inpcb *inp = tp->t_inpcb; 916 struct socket *so; 917 918 INP_INFO_WLOCK_ASSERT(&V_tcbinfo); 919 INP_WLOCK_ASSERT(inp); 920 921 /* Notify any offload devices of listener close */ 922 if (tp->t_state == TCPS_LISTEN) 923 tcp_offload_listen_close(tp); 924 in_pcbdrop(inp); 925 TCPSTAT_INC(tcps_closed); 926 KASSERT(inp->inp_socket != NULL, ("tcp_close: inp_socket NULL")); 927 so = inp->inp_socket; 928 soisdisconnected(so); 929 if (inp->inp_flags & INP_SOCKREF) { 930 KASSERT(so->so_state & SS_PROTOREF, 931 ("tcp_close: !SS_PROTOREF")); 932 inp->inp_flags &= ~INP_SOCKREF; 933 INP_WUNLOCK(inp); 934 ACCEPT_LOCK(); 935 SOCK_LOCK(so); 936 so->so_state &= ~SS_PROTOREF; 937 sofree(so); 938 return (NULL); 939 } 940 return (tp); 941 } 942 943 void 944 tcp_drain(void) 945 { 946 VNET_ITERATOR_DECL(vnet_iter); 947 948 if (!do_tcpdrain) 949 return; 950 951 VNET_LIST_RLOCK_NOSLEEP(); 952 VNET_FOREACH(vnet_iter) { 953 CURVNET_SET(vnet_iter); 954 struct inpcb *inpb; 955 struct tcpcb *tcpb; 956 struct tseg_qent *te; 957 958 /* 959 * Walk the tcpbs, if existing, and flush the reassembly queue, 960 * if there is one... 961 * XXX: The "Net/3" implementation doesn't imply that the TCP 962 * reassembly queue should be flushed, but in a situation 963 * where we're really low on mbufs, this is potentially 964 * usefull. 965 */ 966 INP_INFO_RLOCK(&V_tcbinfo); 967 LIST_FOREACH(inpb, V_tcbinfo.ipi_listhead, inp_list) { 968 if (inpb->inp_flags & INP_TIMEWAIT) 969 continue; 970 INP_WLOCK(inpb); 971 if ((tcpb = intotcpcb(inpb)) != NULL) { 972 while ((te = LIST_FIRST(&tcpb->t_segq)) 973 != NULL) { 974 LIST_REMOVE(te, tqe_q); 975 m_freem(te->tqe_m); 976 uma_zfree(V_tcp_reass_zone, te); 977 tcpb->t_segqlen--; 978 V_tcp_reass_qsize--; 979 } 980 tcp_clean_sackreport(tcpb); 981 } 982 INP_WUNLOCK(inpb); 983 } 984 INP_INFO_RUNLOCK(&V_tcbinfo); 985 CURVNET_RESTORE(); 986 } 987 VNET_LIST_RUNLOCK_NOSLEEP(); 988 } 989 990 /* 991 * Notify a tcp user of an asynchronous error; 992 * store error as soft error, but wake up user 993 * (for now, won't do anything until can select for soft error). 994 * 995 * Do not wake up user since there currently is no mechanism for 996 * reporting soft errors (yet - a kqueue filter may be added). 997 */ 998 static struct inpcb * 999 tcp_notify(struct inpcb *inp, int error) 1000 { 1001 struct tcpcb *tp; 1002 1003 INP_INFO_WLOCK_ASSERT(&V_tcbinfo); 1004 INP_WLOCK_ASSERT(inp); 1005 1006 if ((inp->inp_flags & INP_TIMEWAIT) || 1007 (inp->inp_flags & INP_DROPPED)) 1008 return (inp); 1009 1010 tp = intotcpcb(inp); 1011 KASSERT(tp != NULL, ("tcp_notify: tp == NULL")); 1012 1013 /* 1014 * Ignore some errors if we are hooked up. 1015 * If connection hasn't completed, has retransmitted several times, 1016 * and receives a second error, give up now. This is better 1017 * than waiting a long time to establish a connection that 1018 * can never complete. 1019 */ 1020 if (tp->t_state == TCPS_ESTABLISHED && 1021 (error == EHOSTUNREACH || error == ENETUNREACH || 1022 error == EHOSTDOWN)) { 1023 return (inp); 1024 } else if (tp->t_state < TCPS_ESTABLISHED && tp->t_rxtshift > 3 && 1025 tp->t_softerror) { 1026 tp = tcp_drop(tp, error); 1027 if (tp != NULL) 1028 return (inp); 1029 else 1030 return (NULL); 1031 } else { 1032 tp->t_softerror = error; 1033 return (inp); 1034 } 1035 #if 0 1036 wakeup( &so->so_timeo); 1037 sorwakeup(so); 1038 sowwakeup(so); 1039 #endif 1040 } 1041 1042 static int 1043 tcp_pcblist(SYSCTL_HANDLER_ARGS) 1044 { 1045 int error, i, m, n, pcb_count; 1046 struct inpcb *inp, **inp_list; 1047 inp_gen_t gencnt; 1048 struct xinpgen xig; 1049 1050 /* 1051 * The process of preparing the TCB list is too time-consuming and 1052 * resource-intensive to repeat twice on every request. 1053 */ 1054 if (req->oldptr == NULL) { 1055 m = syncache_pcbcount(); 1056 n = V_tcbinfo.ipi_count; 1057 req->oldidx = 2 * (sizeof xig) 1058 + ((m + n) + n/8) * sizeof(struct xtcpcb); 1059 return (0); 1060 } 1061 1062 if (req->newptr != NULL) 1063 return (EPERM); 1064 1065 /* 1066 * OK, now we're committed to doing something. 1067 */ 1068 INP_INFO_RLOCK(&V_tcbinfo); 1069 gencnt = V_tcbinfo.ipi_gencnt; 1070 n = V_tcbinfo.ipi_count; 1071 INP_INFO_RUNLOCK(&V_tcbinfo); 1072 1073 m = syncache_pcbcount(); 1074 1075 error = sysctl_wire_old_buffer(req, 2 * (sizeof xig) 1076 + (n + m) * sizeof(struct xtcpcb)); 1077 if (error != 0) 1078 return (error); 1079 1080 xig.xig_len = sizeof xig; 1081 xig.xig_count = n + m; 1082 xig.xig_gen = gencnt; 1083 xig.xig_sogen = so_gencnt; 1084 error = SYSCTL_OUT(req, &xig, sizeof xig); 1085 if (error) 1086 return (error); 1087 1088 error = syncache_pcblist(req, m, &pcb_count); 1089 if (error) 1090 return (error); 1091 1092 inp_list = malloc(n * sizeof *inp_list, M_TEMP, M_WAITOK); 1093 if (inp_list == NULL) 1094 return (ENOMEM); 1095 1096 INP_INFO_RLOCK(&V_tcbinfo); 1097 for (inp = LIST_FIRST(V_tcbinfo.ipi_listhead), i = 0; 1098 inp != NULL && i < n; inp = LIST_NEXT(inp, inp_list)) { 1099 INP_RLOCK(inp); 1100 if (inp->inp_gencnt <= gencnt) { 1101 /* 1102 * XXX: This use of cr_cansee(), introduced with 1103 * TCP state changes, is not quite right, but for 1104 * now, better than nothing. 1105 */ 1106 if (inp->inp_flags & INP_TIMEWAIT) { 1107 if (intotw(inp) != NULL) 1108 error = cr_cansee(req->td->td_ucred, 1109 intotw(inp)->tw_cred); 1110 else 1111 error = EINVAL; /* Skip this inp. */ 1112 } else 1113 error = cr_canseeinpcb(req->td->td_ucred, inp); 1114 if (error == 0) 1115 inp_list[i++] = inp; 1116 } 1117 INP_RUNLOCK(inp); 1118 } 1119 INP_INFO_RUNLOCK(&V_tcbinfo); 1120 n = i; 1121 1122 error = 0; 1123 for (i = 0; i < n; i++) { 1124 inp = inp_list[i]; 1125 INP_RLOCK(inp); 1126 if (inp->inp_gencnt <= gencnt) { 1127 struct xtcpcb xt; 1128 void *inp_ppcb; 1129 1130 bzero(&xt, sizeof(xt)); 1131 xt.xt_len = sizeof xt; 1132 /* XXX should avoid extra copy */ 1133 bcopy(inp, &xt.xt_inp, sizeof *inp); 1134 inp_ppcb = inp->inp_ppcb; 1135 if (inp_ppcb == NULL) 1136 bzero((char *) &xt.xt_tp, sizeof xt.xt_tp); 1137 else if (inp->inp_flags & INP_TIMEWAIT) { 1138 bzero((char *) &xt.xt_tp, sizeof xt.xt_tp); 1139 xt.xt_tp.t_state = TCPS_TIME_WAIT; 1140 } else 1141 bcopy(inp_ppcb, &xt.xt_tp, sizeof xt.xt_tp); 1142 if (inp->inp_socket != NULL) 1143 sotoxsocket(inp->inp_socket, &xt.xt_socket); 1144 else { 1145 bzero(&xt.xt_socket, sizeof xt.xt_socket); 1146 xt.xt_socket.xso_protocol = IPPROTO_TCP; 1147 } 1148 xt.xt_inp.inp_gencnt = inp->inp_gencnt; 1149 INP_RUNLOCK(inp); 1150 error = SYSCTL_OUT(req, &xt, sizeof xt); 1151 } else 1152 INP_RUNLOCK(inp); 1153 1154 } 1155 if (!error) { 1156 /* 1157 * Give the user an updated idea of our state. 1158 * If the generation differs from what we told 1159 * her before, she knows that something happened 1160 * while we were processing this request, and it 1161 * might be necessary to retry. 1162 */ 1163 INP_INFO_RLOCK(&V_tcbinfo); 1164 xig.xig_gen = V_tcbinfo.ipi_gencnt; 1165 xig.xig_sogen = so_gencnt; 1166 xig.xig_count = V_tcbinfo.ipi_count + pcb_count; 1167 INP_INFO_RUNLOCK(&V_tcbinfo); 1168 error = SYSCTL_OUT(req, &xig, sizeof xig); 1169 } 1170 free(inp_list, M_TEMP); 1171 return (error); 1172 } 1173 1174 SYSCTL_PROC(_net_inet_tcp, TCPCTL_PCBLIST, pcblist, CTLFLAG_RD, 0, 0, 1175 tcp_pcblist, "S,xtcpcb", "List of active TCP connections"); 1176 1177 static int 1178 tcp_getcred(SYSCTL_HANDLER_ARGS) 1179 { 1180 struct xucred xuc; 1181 struct sockaddr_in addrs[2]; 1182 struct inpcb *inp; 1183 int error; 1184 1185 error = priv_check(req->td, PRIV_NETINET_GETCRED); 1186 if (error) 1187 return (error); 1188 error = SYSCTL_IN(req, addrs, sizeof(addrs)); 1189 if (error) 1190 return (error); 1191 INP_INFO_RLOCK(&V_tcbinfo); 1192 inp = in_pcblookup_hash(&V_tcbinfo, addrs[1].sin_addr, 1193 addrs[1].sin_port, addrs[0].sin_addr, addrs[0].sin_port, 0, NULL); 1194 if (inp != NULL) { 1195 INP_RLOCK(inp); 1196 INP_INFO_RUNLOCK(&V_tcbinfo); 1197 if (inp->inp_socket == NULL) 1198 error = ENOENT; 1199 if (error == 0) 1200 error = cr_canseeinpcb(req->td->td_ucred, inp); 1201 if (error == 0) 1202 cru2x(inp->inp_cred, &xuc); 1203 INP_RUNLOCK(inp); 1204 } else { 1205 INP_INFO_RUNLOCK(&V_tcbinfo); 1206 error = ENOENT; 1207 } 1208 if (error == 0) 1209 error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred)); 1210 return (error); 1211 } 1212 1213 SYSCTL_PROC(_net_inet_tcp, OID_AUTO, getcred, 1214 CTLTYPE_OPAQUE|CTLFLAG_RW|CTLFLAG_PRISON, 0, 0, 1215 tcp_getcred, "S,xucred", "Get the xucred of a TCP connection"); 1216 1217 #ifdef INET6 1218 static int 1219 tcp6_getcred(SYSCTL_HANDLER_ARGS) 1220 { 1221 struct xucred xuc; 1222 struct sockaddr_in6 addrs[2]; 1223 struct inpcb *inp; 1224 int error, mapped = 0; 1225 1226 error = priv_check(req->td, PRIV_NETINET_GETCRED); 1227 if (error) 1228 return (error); 1229 error = SYSCTL_IN(req, addrs, sizeof(addrs)); 1230 if (error) 1231 return (error); 1232 if ((error = sa6_embedscope(&addrs[0], V_ip6_use_defzone)) != 0 || 1233 (error = sa6_embedscope(&addrs[1], V_ip6_use_defzone)) != 0) { 1234 return (error); 1235 } 1236 if (IN6_IS_ADDR_V4MAPPED(&addrs[0].sin6_addr)) { 1237 if (IN6_IS_ADDR_V4MAPPED(&addrs[1].sin6_addr)) 1238 mapped = 1; 1239 else 1240 return (EINVAL); 1241 } 1242 1243 INP_INFO_RLOCK(&V_tcbinfo); 1244 if (mapped == 1) 1245 inp = in_pcblookup_hash(&V_tcbinfo, 1246 *(struct in_addr *)&addrs[1].sin6_addr.s6_addr[12], 1247 addrs[1].sin6_port, 1248 *(struct in_addr *)&addrs[0].sin6_addr.s6_addr[12], 1249 addrs[0].sin6_port, 1250 0, NULL); 1251 else 1252 inp = in6_pcblookup_hash(&V_tcbinfo, 1253 &addrs[1].sin6_addr, addrs[1].sin6_port, 1254 &addrs[0].sin6_addr, addrs[0].sin6_port, 0, NULL); 1255 if (inp != NULL) { 1256 INP_RLOCK(inp); 1257 INP_INFO_RUNLOCK(&V_tcbinfo); 1258 if (inp->inp_socket == NULL) 1259 error = ENOENT; 1260 if (error == 0) 1261 error = cr_canseeinpcb(req->td->td_ucred, inp); 1262 if (error == 0) 1263 cru2x(inp->inp_cred, &xuc); 1264 INP_RUNLOCK(inp); 1265 } else { 1266 INP_INFO_RUNLOCK(&V_tcbinfo); 1267 error = ENOENT; 1268 } 1269 if (error == 0) 1270 error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred)); 1271 return (error); 1272 } 1273 1274 SYSCTL_PROC(_net_inet6_tcp6, OID_AUTO, getcred, 1275 CTLTYPE_OPAQUE|CTLFLAG_RW|CTLFLAG_PRISON, 0, 0, 1276 tcp6_getcred, "S,xucred", "Get the xucred of a TCP6 connection"); 1277 #endif 1278 1279 1280 void 1281 tcp_ctlinput(int cmd, struct sockaddr *sa, void *vip) 1282 { 1283 struct ip *ip = vip; 1284 struct tcphdr *th; 1285 struct in_addr faddr; 1286 struct inpcb *inp; 1287 struct tcpcb *tp; 1288 struct inpcb *(*notify)(struct inpcb *, int) = tcp_notify; 1289 struct icmp *icp; 1290 struct in_conninfo inc; 1291 tcp_seq icmp_tcp_seq; 1292 int mtu; 1293 1294 faddr = ((struct sockaddr_in *)sa)->sin_addr; 1295 if (sa->sa_family != AF_INET || faddr.s_addr == INADDR_ANY) 1296 return; 1297 1298 if (cmd == PRC_MSGSIZE) 1299 notify = tcp_mtudisc; 1300 else if (V_icmp_may_rst && (cmd == PRC_UNREACH_ADMIN_PROHIB || 1301 cmd == PRC_UNREACH_PORT || cmd == PRC_TIMXCEED_INTRANS) && ip) 1302 notify = tcp_drop_syn_sent; 1303 /* 1304 * Redirects don't need to be handled up here. 1305 */ 1306 else if (PRC_IS_REDIRECT(cmd)) 1307 return; 1308 /* 1309 * Source quench is depreciated. 1310 */ 1311 else if (cmd == PRC_QUENCH) 1312 return; 1313 /* 1314 * Hostdead is ugly because it goes linearly through all PCBs. 1315 * XXX: We never get this from ICMP, otherwise it makes an 1316 * excellent DoS attack on machines with many connections. 1317 */ 1318 else if (cmd == PRC_HOSTDEAD) 1319 ip = NULL; 1320 else if ((unsigned)cmd >= PRC_NCMDS || inetctlerrmap[cmd] == 0) 1321 return; 1322 if (ip != NULL) { 1323 icp = (struct icmp *)((caddr_t)ip 1324 - offsetof(struct icmp, icmp_ip)); 1325 th = (struct tcphdr *)((caddr_t)ip 1326 + (ip->ip_hl << 2)); 1327 INP_INFO_WLOCK(&V_tcbinfo); 1328 inp = in_pcblookup_hash(&V_tcbinfo, faddr, th->th_dport, 1329 ip->ip_src, th->th_sport, 0, NULL); 1330 if (inp != NULL) { 1331 INP_WLOCK(inp); 1332 if (!(inp->inp_flags & INP_TIMEWAIT) && 1333 !(inp->inp_flags & INP_DROPPED) && 1334 !(inp->inp_socket == NULL)) { 1335 icmp_tcp_seq = htonl(th->th_seq); 1336 tp = intotcpcb(inp); 1337 if (SEQ_GEQ(icmp_tcp_seq, tp->snd_una) && 1338 SEQ_LT(icmp_tcp_seq, tp->snd_max)) { 1339 if (cmd == PRC_MSGSIZE) { 1340 /* 1341 * MTU discovery: 1342 * If we got a needfrag set the MTU 1343 * in the route to the suggested new 1344 * value (if given) and then notify. 1345 */ 1346 bzero(&inc, sizeof(inc)); 1347 inc.inc_faddr = faddr; 1348 inc.inc_fibnum = 1349 inp->inp_inc.inc_fibnum; 1350 1351 mtu = ntohs(icp->icmp_nextmtu); 1352 /* 1353 * If no alternative MTU was 1354 * proposed, try the next smaller 1355 * one. ip->ip_len has already 1356 * been swapped in icmp_input(). 1357 */ 1358 if (!mtu) 1359 mtu = ip_next_mtu(ip->ip_len, 1360 1); 1361 if (mtu < max(296, V_tcp_minmss 1362 + sizeof(struct tcpiphdr))) 1363 mtu = 0; 1364 if (!mtu) 1365 mtu = V_tcp_mssdflt 1366 + sizeof(struct tcpiphdr); 1367 /* 1368 * Only cache the the MTU if it 1369 * is smaller than the interface 1370 * or route MTU. tcp_mtudisc() 1371 * will do right thing by itself. 1372 */ 1373 if (mtu <= tcp_maxmtu(&inc, NULL)) 1374 tcp_hc_updatemtu(&inc, mtu); 1375 } 1376 1377 inp = (*notify)(inp, inetctlerrmap[cmd]); 1378 } 1379 } 1380 if (inp != NULL) 1381 INP_WUNLOCK(inp); 1382 } else { 1383 bzero(&inc, sizeof(inc)); 1384 inc.inc_fport = th->th_dport; 1385 inc.inc_lport = th->th_sport; 1386 inc.inc_faddr = faddr; 1387 inc.inc_laddr = ip->ip_src; 1388 syncache_unreach(&inc, th); 1389 } 1390 INP_INFO_WUNLOCK(&V_tcbinfo); 1391 } else 1392 in_pcbnotifyall(&V_tcbinfo, faddr, inetctlerrmap[cmd], notify); 1393 } 1394 1395 #ifdef INET6 1396 void 1397 tcp6_ctlinput(int cmd, struct sockaddr *sa, void *d) 1398 { 1399 struct tcphdr th; 1400 struct inpcb *(*notify)(struct inpcb *, int) = tcp_notify; 1401 struct ip6_hdr *ip6; 1402 struct mbuf *m; 1403 struct ip6ctlparam *ip6cp = NULL; 1404 const struct sockaddr_in6 *sa6_src = NULL; 1405 int off; 1406 struct tcp_portonly { 1407 u_int16_t th_sport; 1408 u_int16_t th_dport; 1409 } *thp; 1410 1411 if (sa->sa_family != AF_INET6 || 1412 sa->sa_len != sizeof(struct sockaddr_in6)) 1413 return; 1414 1415 if (cmd == PRC_MSGSIZE) 1416 notify = tcp_mtudisc; 1417 else if (!PRC_IS_REDIRECT(cmd) && 1418 ((unsigned)cmd >= PRC_NCMDS || inet6ctlerrmap[cmd] == 0)) 1419 return; 1420 /* Source quench is depreciated. */ 1421 else if (cmd == PRC_QUENCH) 1422 return; 1423 1424 /* if the parameter is from icmp6, decode it. */ 1425 if (d != NULL) { 1426 ip6cp = (struct ip6ctlparam *)d; 1427 m = ip6cp->ip6c_m; 1428 ip6 = ip6cp->ip6c_ip6; 1429 off = ip6cp->ip6c_off; 1430 sa6_src = ip6cp->ip6c_src; 1431 } else { 1432 m = NULL; 1433 ip6 = NULL; 1434 off = 0; /* fool gcc */ 1435 sa6_src = &sa6_any; 1436 } 1437 1438 if (ip6 != NULL) { 1439 struct in_conninfo inc; 1440 /* 1441 * XXX: We assume that when IPV6 is non NULL, 1442 * M and OFF are valid. 1443 */ 1444 1445 /* check if we can safely examine src and dst ports */ 1446 if (m->m_pkthdr.len < off + sizeof(*thp)) 1447 return; 1448 1449 bzero(&th, sizeof(th)); 1450 m_copydata(m, off, sizeof(*thp), (caddr_t)&th); 1451 1452 in6_pcbnotify(&V_tcbinfo, sa, th.th_dport, 1453 (struct sockaddr *)ip6cp->ip6c_src, 1454 th.th_sport, cmd, NULL, notify); 1455 1456 bzero(&inc, sizeof(inc)); 1457 inc.inc_fport = th.th_dport; 1458 inc.inc_lport = th.th_sport; 1459 inc.inc6_faddr = ((struct sockaddr_in6 *)sa)->sin6_addr; 1460 inc.inc6_laddr = ip6cp->ip6c_src->sin6_addr; 1461 inc.inc_flags |= INC_ISIPV6; 1462 INP_INFO_WLOCK(&V_tcbinfo); 1463 syncache_unreach(&inc, &th); 1464 INP_INFO_WUNLOCK(&V_tcbinfo); 1465 } else 1466 in6_pcbnotify(&V_tcbinfo, sa, 0, (const struct sockaddr *)sa6_src, 1467 0, cmd, NULL, notify); 1468 } 1469 #endif /* INET6 */ 1470 1471 1472 /* 1473 * Following is where TCP initial sequence number generation occurs. 1474 * 1475 * There are two places where we must use initial sequence numbers: 1476 * 1. In SYN-ACK packets. 1477 * 2. In SYN packets. 1478 * 1479 * All ISNs for SYN-ACK packets are generated by the syncache. See 1480 * tcp_syncache.c for details. 1481 * 1482 * The ISNs in SYN packets must be monotonic; TIME_WAIT recycling 1483 * depends on this property. In addition, these ISNs should be 1484 * unguessable so as to prevent connection hijacking. To satisfy 1485 * the requirements of this situation, the algorithm outlined in 1486 * RFC 1948 is used, with only small modifications. 1487 * 1488 * Implementation details: 1489 * 1490 * Time is based off the system timer, and is corrected so that it 1491 * increases by one megabyte per second. This allows for proper 1492 * recycling on high speed LANs while still leaving over an hour 1493 * before rollover. 1494 * 1495 * As reading the *exact* system time is too expensive to be done 1496 * whenever setting up a TCP connection, we increment the time 1497 * offset in two ways. First, a small random positive increment 1498 * is added to isn_offset for each connection that is set up. 1499 * Second, the function tcp_isn_tick fires once per clock tick 1500 * and increments isn_offset as necessary so that sequence numbers 1501 * are incremented at approximately ISN_BYTES_PER_SECOND. The 1502 * random positive increments serve only to ensure that the same 1503 * exact sequence number is never sent out twice (as could otherwise 1504 * happen when a port is recycled in less than the system tick 1505 * interval.) 1506 * 1507 * net.inet.tcp.isn_reseed_interval controls the number of seconds 1508 * between seeding of isn_secret. This is normally set to zero, 1509 * as reseeding should not be necessary. 1510 * 1511 * Locking of the global variables isn_secret, isn_last_reseed, isn_offset, 1512 * isn_offset_old, and isn_ctx is performed using the TCP pcbinfo lock. In 1513 * general, this means holding an exclusive (write) lock. 1514 */ 1515 1516 #define ISN_BYTES_PER_SECOND 1048576 1517 #define ISN_STATIC_INCREMENT 4096 1518 #define ISN_RANDOM_INCREMENT (4096 - 1) 1519 1520 static VNET_DEFINE(u_char, isn_secret[32]); 1521 static VNET_DEFINE(int, isn_last_reseed); 1522 static VNET_DEFINE(u_int32_t, isn_offset); 1523 static VNET_DEFINE(u_int32_t, isn_offset_old); 1524 1525 #define V_isn_secret VNET(isn_secret) 1526 #define V_isn_last_reseed VNET(isn_last_reseed) 1527 #define V_isn_offset VNET(isn_offset) 1528 #define V_isn_offset_old VNET(isn_offset_old) 1529 1530 tcp_seq 1531 tcp_new_isn(struct tcpcb *tp) 1532 { 1533 MD5_CTX isn_ctx; 1534 u_int32_t md5_buffer[4]; 1535 tcp_seq new_isn; 1536 1537 INP_WLOCK_ASSERT(tp->t_inpcb); 1538 1539 ISN_LOCK(); 1540 /* Seed if this is the first use, reseed if requested. */ 1541 if ((V_isn_last_reseed == 0) || ((V_tcp_isn_reseed_interval > 0) && 1542 (((u_int)V_isn_last_reseed + (u_int)V_tcp_isn_reseed_interval*hz) 1543 < (u_int)ticks))) { 1544 read_random(&V_isn_secret, sizeof(V_isn_secret)); 1545 V_isn_last_reseed = ticks; 1546 } 1547 1548 /* Compute the md5 hash and return the ISN. */ 1549 MD5Init(&isn_ctx); 1550 MD5Update(&isn_ctx, (u_char *) &tp->t_inpcb->inp_fport, sizeof(u_short)); 1551 MD5Update(&isn_ctx, (u_char *) &tp->t_inpcb->inp_lport, sizeof(u_short)); 1552 #ifdef INET6 1553 if ((tp->t_inpcb->inp_vflag & INP_IPV6) != 0) { 1554 MD5Update(&isn_ctx, (u_char *) &tp->t_inpcb->in6p_faddr, 1555 sizeof(struct in6_addr)); 1556 MD5Update(&isn_ctx, (u_char *) &tp->t_inpcb->in6p_laddr, 1557 sizeof(struct in6_addr)); 1558 } else 1559 #endif 1560 { 1561 MD5Update(&isn_ctx, (u_char *) &tp->t_inpcb->inp_faddr, 1562 sizeof(struct in_addr)); 1563 MD5Update(&isn_ctx, (u_char *) &tp->t_inpcb->inp_laddr, 1564 sizeof(struct in_addr)); 1565 } 1566 MD5Update(&isn_ctx, (u_char *) &V_isn_secret, sizeof(V_isn_secret)); 1567 MD5Final((u_char *) &md5_buffer, &isn_ctx); 1568 new_isn = (tcp_seq) md5_buffer[0]; 1569 V_isn_offset += ISN_STATIC_INCREMENT + 1570 (arc4random() & ISN_RANDOM_INCREMENT); 1571 new_isn += V_isn_offset; 1572 ISN_UNLOCK(); 1573 return (new_isn); 1574 } 1575 1576 /* 1577 * Increment the offset to the next ISN_BYTES_PER_SECOND / 100 boundary 1578 * to keep time flowing at a relatively constant rate. If the random 1579 * increments have already pushed us past the projected offset, do nothing. 1580 */ 1581 static void 1582 tcp_isn_tick(void *xtp) 1583 { 1584 VNET_ITERATOR_DECL(vnet_iter); 1585 u_int32_t projected_offset; 1586 1587 VNET_LIST_RLOCK_NOSLEEP(); 1588 ISN_LOCK(); 1589 VNET_FOREACH(vnet_iter) { 1590 CURVNET_SET(vnet_iter); /* XXX appease INVARIANTS */ 1591 projected_offset = 1592 V_isn_offset_old + ISN_BYTES_PER_SECOND / 100; 1593 1594 if (SEQ_GT(projected_offset, V_isn_offset)) 1595 V_isn_offset = projected_offset; 1596 1597 V_isn_offset_old = V_isn_offset; 1598 CURVNET_RESTORE(); 1599 } 1600 ISN_UNLOCK(); 1601 VNET_LIST_RUNLOCK_NOSLEEP(); 1602 callout_reset(&isn_callout, hz/100, tcp_isn_tick, NULL); 1603 } 1604 1605 /* 1606 * When a specific ICMP unreachable message is received and the 1607 * connection state is SYN-SENT, drop the connection. This behavior 1608 * is controlled by the icmp_may_rst sysctl. 1609 */ 1610 struct inpcb * 1611 tcp_drop_syn_sent(struct inpcb *inp, int errno) 1612 { 1613 struct tcpcb *tp; 1614 1615 INP_INFO_WLOCK_ASSERT(&V_tcbinfo); 1616 INP_WLOCK_ASSERT(inp); 1617 1618 if ((inp->inp_flags & INP_TIMEWAIT) || 1619 (inp->inp_flags & INP_DROPPED)) 1620 return (inp); 1621 1622 tp = intotcpcb(inp); 1623 if (tp->t_state != TCPS_SYN_SENT) 1624 return (inp); 1625 1626 tp = tcp_drop(tp, errno); 1627 if (tp != NULL) 1628 return (inp); 1629 else 1630 return (NULL); 1631 } 1632 1633 /* 1634 * When `need fragmentation' ICMP is received, update our idea of the MSS 1635 * based on the new value in the route. Also nudge TCP to send something, 1636 * since we know the packet we just sent was dropped. 1637 * This duplicates some code in the tcp_mss() function in tcp_input.c. 1638 */ 1639 struct inpcb * 1640 tcp_mtudisc(struct inpcb *inp, int errno) 1641 { 1642 struct tcpcb *tp; 1643 struct socket *so; 1644 1645 INP_WLOCK_ASSERT(inp); 1646 if ((inp->inp_flags & INP_TIMEWAIT) || 1647 (inp->inp_flags & INP_DROPPED)) 1648 return (inp); 1649 1650 tp = intotcpcb(inp); 1651 KASSERT(tp != NULL, ("tcp_mtudisc: tp == NULL")); 1652 1653 tcp_mss_update(tp, -1, NULL, NULL); 1654 1655 so = inp->inp_socket; 1656 SOCKBUF_LOCK(&so->so_snd); 1657 /* If the mss is larger than the socket buffer, decrease the mss. */ 1658 if (so->so_snd.sb_hiwat < tp->t_maxseg) 1659 tp->t_maxseg = so->so_snd.sb_hiwat; 1660 SOCKBUF_UNLOCK(&so->so_snd); 1661 1662 TCPSTAT_INC(tcps_mturesent); 1663 tp->t_rtttime = 0; 1664 tp->snd_nxt = tp->snd_una; 1665 tcp_free_sackholes(tp); 1666 tp->snd_recover = tp->snd_max; 1667 if (tp->t_flags & TF_SACK_PERMIT) 1668 EXIT_FASTRECOVERY(tp); 1669 tcp_output_send(tp); 1670 return (inp); 1671 } 1672 1673 /* 1674 * Look-up the routing entry to the peer of this inpcb. If no route 1675 * is found and it cannot be allocated, then return 0. This routine 1676 * is called by TCP routines that access the rmx structure and by 1677 * tcp_mss_update to get the peer/interface MTU. 1678 */ 1679 u_long 1680 tcp_maxmtu(struct in_conninfo *inc, int *flags) 1681 { 1682 struct route sro; 1683 struct sockaddr_in *dst; 1684 struct ifnet *ifp; 1685 u_long maxmtu = 0; 1686 1687 KASSERT(inc != NULL, ("tcp_maxmtu with NULL in_conninfo pointer")); 1688 1689 bzero(&sro, sizeof(sro)); 1690 if (inc->inc_faddr.s_addr != INADDR_ANY) { 1691 dst = (struct sockaddr_in *)&sro.ro_dst; 1692 dst->sin_family = AF_INET; 1693 dst->sin_len = sizeof(*dst); 1694 dst->sin_addr = inc->inc_faddr; 1695 in_rtalloc_ign(&sro, 0, inc->inc_fibnum); 1696 } 1697 if (sro.ro_rt != NULL) { 1698 ifp = sro.ro_rt->rt_ifp; 1699 if (sro.ro_rt->rt_rmx.rmx_mtu == 0) 1700 maxmtu = ifp->if_mtu; 1701 else 1702 maxmtu = min(sro.ro_rt->rt_rmx.rmx_mtu, ifp->if_mtu); 1703 1704 /* Report additional interface capabilities. */ 1705 if (flags != NULL) { 1706 if (ifp->if_capenable & IFCAP_TSO4 && 1707 ifp->if_hwassist & CSUM_TSO) 1708 *flags |= CSUM_TSO; 1709 } 1710 RTFREE(sro.ro_rt); 1711 } 1712 return (maxmtu); 1713 } 1714 1715 #ifdef INET6 1716 u_long 1717 tcp_maxmtu6(struct in_conninfo *inc, int *flags) 1718 { 1719 struct route_in6 sro6; 1720 struct ifnet *ifp; 1721 u_long maxmtu = 0; 1722 1723 KASSERT(inc != NULL, ("tcp_maxmtu6 with NULL in_conninfo pointer")); 1724 1725 bzero(&sro6, sizeof(sro6)); 1726 if (!IN6_IS_ADDR_UNSPECIFIED(&inc->inc6_faddr)) { 1727 sro6.ro_dst.sin6_family = AF_INET6; 1728 sro6.ro_dst.sin6_len = sizeof(struct sockaddr_in6); 1729 sro6.ro_dst.sin6_addr = inc->inc6_faddr; 1730 rtalloc_ign((struct route *)&sro6, 0); 1731 } 1732 if (sro6.ro_rt != NULL) { 1733 ifp = sro6.ro_rt->rt_ifp; 1734 if (sro6.ro_rt->rt_rmx.rmx_mtu == 0) 1735 maxmtu = IN6_LINKMTU(sro6.ro_rt->rt_ifp); 1736 else 1737 maxmtu = min(sro6.ro_rt->rt_rmx.rmx_mtu, 1738 IN6_LINKMTU(sro6.ro_rt->rt_ifp)); 1739 1740 /* Report additional interface capabilities. */ 1741 if (flags != NULL) { 1742 if (ifp->if_capenable & IFCAP_TSO6 && 1743 ifp->if_hwassist & CSUM_TSO) 1744 *flags |= CSUM_TSO; 1745 } 1746 RTFREE(sro6.ro_rt); 1747 } 1748 1749 return (maxmtu); 1750 } 1751 #endif /* INET6 */ 1752 1753 #ifdef IPSEC 1754 /* compute ESP/AH header size for TCP, including outer IP header. */ 1755 size_t 1756 ipsec_hdrsiz_tcp(struct tcpcb *tp) 1757 { 1758 struct inpcb *inp; 1759 struct mbuf *m; 1760 size_t hdrsiz; 1761 struct ip *ip; 1762 #ifdef INET6 1763 struct ip6_hdr *ip6; 1764 #endif 1765 struct tcphdr *th; 1766 1767 if ((tp == NULL) || ((inp = tp->t_inpcb) == NULL)) 1768 return (0); 1769 MGETHDR(m, M_DONTWAIT, MT_DATA); 1770 if (!m) 1771 return (0); 1772 1773 #ifdef INET6 1774 if ((inp->inp_vflag & INP_IPV6) != 0) { 1775 ip6 = mtod(m, struct ip6_hdr *); 1776 th = (struct tcphdr *)(ip6 + 1); 1777 m->m_pkthdr.len = m->m_len = 1778 sizeof(struct ip6_hdr) + sizeof(struct tcphdr); 1779 tcpip_fillheaders(inp, ip6, th); 1780 hdrsiz = ipsec_hdrsiz(m, IPSEC_DIR_OUTBOUND, inp); 1781 } else 1782 #endif /* INET6 */ 1783 { 1784 ip = mtod(m, struct ip *); 1785 th = (struct tcphdr *)(ip + 1); 1786 m->m_pkthdr.len = m->m_len = sizeof(struct tcpiphdr); 1787 tcpip_fillheaders(inp, ip, th); 1788 hdrsiz = ipsec_hdrsiz(m, IPSEC_DIR_OUTBOUND, inp); 1789 } 1790 1791 m_free(m); 1792 return (hdrsiz); 1793 } 1794 #endif /* IPSEC */ 1795 1796 /* 1797 * TCP BANDWIDTH DELAY PRODUCT WINDOW LIMITING 1798 * 1799 * This code attempts to calculate the bandwidth-delay product as a 1800 * means of determining the optimal window size to maximize bandwidth, 1801 * minimize RTT, and avoid the over-allocation of buffers on interfaces and 1802 * routers. This code also does a fairly good job keeping RTTs in check 1803 * across slow links like modems. We implement an algorithm which is very 1804 * similar (but not meant to be) TCP/Vegas. The code operates on the 1805 * transmitter side of a TCP connection and so only effects the transmit 1806 * side of the connection. 1807 * 1808 * BACKGROUND: TCP makes no provision for the management of buffer space 1809 * at the end points or at the intermediate routers and switches. A TCP 1810 * stream, whether using NewReno or not, will eventually buffer as 1811 * many packets as it is able and the only reason this typically works is 1812 * due to the fairly small default buffers made available for a connection 1813 * (typicaly 16K or 32K). As machines use larger windows and/or window 1814 * scaling it is now fairly easy for even a single TCP connection to blow-out 1815 * all available buffer space not only on the local interface, but on 1816 * intermediate routers and switches as well. NewReno makes a misguided 1817 * attempt to 'solve' this problem by waiting for an actual failure to occur, 1818 * then backing off, then steadily increasing the window again until another 1819 * failure occurs, ad-infinitum. This results in terrible oscillation that 1820 * is only made worse as network loads increase and the idea of intentionally 1821 * blowing out network buffers is, frankly, a terrible way to manage network 1822 * resources. 1823 * 1824 * It is far better to limit the transmit window prior to the failure 1825 * condition being achieved. There are two general ways to do this: First 1826 * you can 'scan' through different transmit window sizes and locate the 1827 * point where the RTT stops increasing, indicating that you have filled the 1828 * pipe, then scan backwards until you note that RTT stops decreasing, then 1829 * repeat ad-infinitum. This method works in principle but has severe 1830 * implementation issues due to RTT variances, timer granularity, and 1831 * instability in the algorithm which can lead to many false positives and 1832 * create oscillations as well as interact badly with other TCP streams 1833 * implementing the same algorithm. 1834 * 1835 * The second method is to limit the window to the bandwidth delay product 1836 * of the link. This is the method we implement. RTT variances and our 1837 * own manipulation of the congestion window, bwnd, can potentially 1838 * destabilize the algorithm. For this reason we have to stabilize the 1839 * elements used to calculate the window. We do this by using the minimum 1840 * observed RTT, the long term average of the observed bandwidth, and 1841 * by adding two segments worth of slop. It isn't perfect but it is able 1842 * to react to changing conditions and gives us a very stable basis on 1843 * which to extend the algorithm. 1844 */ 1845 void 1846 tcp_xmit_bandwidth_limit(struct tcpcb *tp, tcp_seq ack_seq) 1847 { 1848 u_long bw; 1849 u_long bwnd; 1850 int save_ticks; 1851 1852 INP_WLOCK_ASSERT(tp->t_inpcb); 1853 1854 /* 1855 * If inflight_enable is disabled in the middle of a tcp connection, 1856 * make sure snd_bwnd is effectively disabled. 1857 */ 1858 if (V_tcp_inflight_enable == 0 || 1859 tp->t_rttlow < V_tcp_inflight_rttthresh) { 1860 tp->snd_bwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT; 1861 tp->snd_bandwidth = 0; 1862 return; 1863 } 1864 1865 /* 1866 * Figure out the bandwidth. Due to the tick granularity this 1867 * is a very rough number and it MUST be averaged over a fairly 1868 * long period of time. XXX we need to take into account a link 1869 * that is not using all available bandwidth, but for now our 1870 * slop will ramp us up if this case occurs and the bandwidth later 1871 * increases. 1872 * 1873 * Note: if ticks rollover 'bw' may wind up negative. We must 1874 * effectively reset t_bw_rtttime for this case. 1875 */ 1876 save_ticks = ticks; 1877 if ((u_int)(save_ticks - tp->t_bw_rtttime) < 1) 1878 return; 1879 1880 bw = (int64_t)(ack_seq - tp->t_bw_rtseq) * hz / 1881 (save_ticks - tp->t_bw_rtttime); 1882 tp->t_bw_rtttime = save_ticks; 1883 tp->t_bw_rtseq = ack_seq; 1884 if (tp->t_bw_rtttime == 0 || (int)bw < 0) 1885 return; 1886 bw = ((int64_t)tp->snd_bandwidth * 15 + bw) >> 4; 1887 1888 tp->snd_bandwidth = bw; 1889 1890 /* 1891 * Calculate the semi-static bandwidth delay product, plus two maximal 1892 * segments. The additional slop puts us squarely in the sweet 1893 * spot and also handles the bandwidth run-up case and stabilization. 1894 * Without the slop we could be locking ourselves into a lower 1895 * bandwidth. 1896 * 1897 * Situations Handled: 1898 * (1) Prevents over-queueing of packets on LANs, especially on 1899 * high speed LANs, allowing larger TCP buffers to be 1900 * specified, and also does a good job preventing 1901 * over-queueing of packets over choke points like modems 1902 * (at least for the transmit side). 1903 * 1904 * (2) Is able to handle changing network loads (bandwidth 1905 * drops so bwnd drops, bandwidth increases so bwnd 1906 * increases). 1907 * 1908 * (3) Theoretically should stabilize in the face of multiple 1909 * connections implementing the same algorithm (this may need 1910 * a little work). 1911 * 1912 * (4) Stability value (defaults to 20 = 2 maximal packets) can 1913 * be adjusted with a sysctl but typically only needs to be 1914 * on very slow connections. A value no smaller then 5 1915 * should be used, but only reduce this default if you have 1916 * no other choice. 1917 */ 1918 #define USERTT ((tp->t_srtt + tp->t_rttbest) / 2) 1919 bwnd = (int64_t)bw * USERTT / (hz << TCP_RTT_SHIFT) + V_tcp_inflight_stab * tp->t_maxseg / 10; 1920 #undef USERTT 1921 1922 if (tcp_inflight_debug > 0) { 1923 static int ltime; 1924 if ((u_int)(ticks - ltime) >= hz / tcp_inflight_debug) { 1925 ltime = ticks; 1926 printf("%p bw %ld rttbest %d srtt %d bwnd %ld\n", 1927 tp, 1928 bw, 1929 tp->t_rttbest, 1930 tp->t_srtt, 1931 bwnd 1932 ); 1933 } 1934 } 1935 if ((long)bwnd < V_tcp_inflight_min) 1936 bwnd = V_tcp_inflight_min; 1937 if (bwnd > V_tcp_inflight_max) 1938 bwnd = V_tcp_inflight_max; 1939 if ((long)bwnd < tp->t_maxseg * 2) 1940 bwnd = tp->t_maxseg * 2; 1941 tp->snd_bwnd = bwnd; 1942 } 1943 1944 #ifdef TCP_SIGNATURE 1945 /* 1946 * Callback function invoked by m_apply() to digest TCP segment data 1947 * contained within an mbuf chain. 1948 */ 1949 static int 1950 tcp_signature_apply(void *fstate, void *data, u_int len) 1951 { 1952 1953 MD5Update(fstate, (u_char *)data, len); 1954 return (0); 1955 } 1956 1957 /* 1958 * Compute TCP-MD5 hash of a TCP segment. (RFC2385) 1959 * 1960 * Parameters: 1961 * m pointer to head of mbuf chain 1962 * _unused 1963 * len length of TCP segment data, excluding options 1964 * optlen length of TCP segment options 1965 * buf pointer to storage for computed MD5 digest 1966 * direction direction of flow (IPSEC_DIR_INBOUND or OUTBOUND) 1967 * 1968 * We do this over ip, tcphdr, segment data, and the key in the SADB. 1969 * When called from tcp_input(), we can be sure that th_sum has been 1970 * zeroed out and verified already. 1971 * 1972 * Return 0 if successful, otherwise return -1. 1973 * 1974 * XXX The key is retrieved from the system's PF_KEY SADB, by keying a 1975 * search with the destination IP address, and a 'magic SPI' to be 1976 * determined by the application. This is hardcoded elsewhere to 1179 1977 * right now. Another branch of this code exists which uses the SPD to 1978 * specify per-application flows but it is unstable. 1979 */ 1980 int 1981 tcp_signature_compute(struct mbuf *m, int _unused, int len, int optlen, 1982 u_char *buf, u_int direction) 1983 { 1984 union sockaddr_union dst; 1985 struct ippseudo ippseudo; 1986 MD5_CTX ctx; 1987 int doff; 1988 struct ip *ip; 1989 struct ipovly *ipovly; 1990 struct secasvar *sav; 1991 struct tcphdr *th; 1992 #ifdef INET6 1993 struct ip6_hdr *ip6; 1994 struct in6_addr in6; 1995 char ip6buf[INET6_ADDRSTRLEN]; 1996 uint32_t plen; 1997 uint16_t nhdr; 1998 #endif 1999 u_short savecsum; 2000 2001 KASSERT(m != NULL, ("NULL mbuf chain")); 2002 KASSERT(buf != NULL, ("NULL signature pointer")); 2003 2004 /* Extract the destination from the IP header in the mbuf. */ 2005 bzero(&dst, sizeof(union sockaddr_union)); 2006 ip = mtod(m, struct ip *); 2007 #ifdef INET6 2008 ip6 = NULL; /* Make the compiler happy. */ 2009 #endif 2010 switch (ip->ip_v) { 2011 case IPVERSION: 2012 dst.sa.sa_len = sizeof(struct sockaddr_in); 2013 dst.sa.sa_family = AF_INET; 2014 dst.sin.sin_addr = (direction == IPSEC_DIR_INBOUND) ? 2015 ip->ip_src : ip->ip_dst; 2016 break; 2017 #ifdef INET6 2018 case (IPV6_VERSION >> 4): 2019 ip6 = mtod(m, struct ip6_hdr *); 2020 dst.sa.sa_len = sizeof(struct sockaddr_in6); 2021 dst.sa.sa_family = AF_INET6; 2022 dst.sin6.sin6_addr = (direction == IPSEC_DIR_INBOUND) ? 2023 ip6->ip6_src : ip6->ip6_dst; 2024 break; 2025 #endif 2026 default: 2027 return (EINVAL); 2028 /* NOTREACHED */ 2029 break; 2030 } 2031 2032 /* Look up an SADB entry which matches the address of the peer. */ 2033 sav = KEY_ALLOCSA(&dst, IPPROTO_TCP, htonl(TCP_SIG_SPI)); 2034 if (sav == NULL) { 2035 ipseclog((LOG_ERR, "%s: SADB lookup failed for %s\n", __func__, 2036 (ip->ip_v == IPVERSION) ? inet_ntoa(dst.sin.sin_addr) : 2037 #ifdef INET6 2038 (ip->ip_v == (IPV6_VERSION >> 4)) ? 2039 ip6_sprintf(ip6buf, &dst.sin6.sin6_addr) : 2040 #endif 2041 "(unsupported)")); 2042 return (EINVAL); 2043 } 2044 2045 MD5Init(&ctx); 2046 /* 2047 * Step 1: Update MD5 hash with IP(v6) pseudo-header. 2048 * 2049 * XXX The ippseudo header MUST be digested in network byte order, 2050 * or else we'll fail the regression test. Assume all fields we've 2051 * been doing arithmetic on have been in host byte order. 2052 * XXX One cannot depend on ipovly->ih_len here. When called from 2053 * tcp_output(), the underlying ip_len member has not yet been set. 2054 */ 2055 switch (ip->ip_v) { 2056 case IPVERSION: 2057 ipovly = (struct ipovly *)ip; 2058 ippseudo.ippseudo_src = ipovly->ih_src; 2059 ippseudo.ippseudo_dst = ipovly->ih_dst; 2060 ippseudo.ippseudo_pad = 0; 2061 ippseudo.ippseudo_p = IPPROTO_TCP; 2062 ippseudo.ippseudo_len = htons(len + sizeof(struct tcphdr) + 2063 optlen); 2064 MD5Update(&ctx, (char *)&ippseudo, sizeof(struct ippseudo)); 2065 2066 th = (struct tcphdr *)((u_char *)ip + sizeof(struct ip)); 2067 doff = sizeof(struct ip) + sizeof(struct tcphdr) + optlen; 2068 break; 2069 #ifdef INET6 2070 /* 2071 * RFC 2385, 2.0 Proposal 2072 * For IPv6, the pseudo-header is as described in RFC 2460, namely the 2073 * 128-bit source IPv6 address, 128-bit destination IPv6 address, zero- 2074 * extended next header value (to form 32 bits), and 32-bit segment 2075 * length. 2076 * Note: Upper-Layer Packet Length comes before Next Header. 2077 */ 2078 case (IPV6_VERSION >> 4): 2079 in6 = ip6->ip6_src; 2080 in6_clearscope(&in6); 2081 MD5Update(&ctx, (char *)&in6, sizeof(struct in6_addr)); 2082 in6 = ip6->ip6_dst; 2083 in6_clearscope(&in6); 2084 MD5Update(&ctx, (char *)&in6, sizeof(struct in6_addr)); 2085 plen = htonl(len + sizeof(struct tcphdr) + optlen); 2086 MD5Update(&ctx, (char *)&plen, sizeof(uint32_t)); 2087 nhdr = 0; 2088 MD5Update(&ctx, (char *)&nhdr, sizeof(uint8_t)); 2089 MD5Update(&ctx, (char *)&nhdr, sizeof(uint8_t)); 2090 MD5Update(&ctx, (char *)&nhdr, sizeof(uint8_t)); 2091 nhdr = IPPROTO_TCP; 2092 MD5Update(&ctx, (char *)&nhdr, sizeof(uint8_t)); 2093 2094 th = (struct tcphdr *)((u_char *)ip6 + sizeof(struct ip6_hdr)); 2095 doff = sizeof(struct ip6_hdr) + sizeof(struct tcphdr) + optlen; 2096 break; 2097 #endif 2098 default: 2099 return (EINVAL); 2100 /* NOTREACHED */ 2101 break; 2102 } 2103 2104 2105 /* 2106 * Step 2: Update MD5 hash with TCP header, excluding options. 2107 * The TCP checksum must be set to zero. 2108 */ 2109 savecsum = th->th_sum; 2110 th->th_sum = 0; 2111 MD5Update(&ctx, (char *)th, sizeof(struct tcphdr)); 2112 th->th_sum = savecsum; 2113 2114 /* 2115 * Step 3: Update MD5 hash with TCP segment data. 2116 * Use m_apply() to avoid an early m_pullup(). 2117 */ 2118 if (len > 0) 2119 m_apply(m, doff, len, tcp_signature_apply, &ctx); 2120 2121 /* 2122 * Step 4: Update MD5 hash with shared secret. 2123 */ 2124 MD5Update(&ctx, sav->key_auth->key_data, _KEYLEN(sav->key_auth)); 2125 MD5Final(buf, &ctx); 2126 2127 key_sa_recordxfer(sav, m); 2128 KEY_FREESAV(&sav); 2129 return (0); 2130 } 2131 #endif /* TCP_SIGNATURE */ 2132 2133 static int 2134 sysctl_drop(SYSCTL_HANDLER_ARGS) 2135 { 2136 /* addrs[0] is a foreign socket, addrs[1] is a local one. */ 2137 struct sockaddr_storage addrs[2]; 2138 struct inpcb *inp; 2139 struct tcpcb *tp; 2140 struct tcptw *tw; 2141 struct sockaddr_in *fin, *lin; 2142 #ifdef INET6 2143 struct sockaddr_in6 *fin6, *lin6; 2144 #endif 2145 int error; 2146 2147 inp = NULL; 2148 fin = lin = NULL; 2149 #ifdef INET6 2150 fin6 = lin6 = NULL; 2151 #endif 2152 error = 0; 2153 2154 if (req->oldptr != NULL || req->oldlen != 0) 2155 return (EINVAL); 2156 if (req->newptr == NULL) 2157 return (EPERM); 2158 if (req->newlen < sizeof(addrs)) 2159 return (ENOMEM); 2160 error = SYSCTL_IN(req, &addrs, sizeof(addrs)); 2161 if (error) 2162 return (error); 2163 2164 switch (addrs[0].ss_family) { 2165 #ifdef INET6 2166 case AF_INET6: 2167 fin6 = (struct sockaddr_in6 *)&addrs[0]; 2168 lin6 = (struct sockaddr_in6 *)&addrs[1]; 2169 if (fin6->sin6_len != sizeof(struct sockaddr_in6) || 2170 lin6->sin6_len != sizeof(struct sockaddr_in6)) 2171 return (EINVAL); 2172 if (IN6_IS_ADDR_V4MAPPED(&fin6->sin6_addr)) { 2173 if (!IN6_IS_ADDR_V4MAPPED(&lin6->sin6_addr)) 2174 return (EINVAL); 2175 in6_sin6_2_sin_in_sock((struct sockaddr *)&addrs[0]); 2176 in6_sin6_2_sin_in_sock((struct sockaddr *)&addrs[1]); 2177 fin = (struct sockaddr_in *)&addrs[0]; 2178 lin = (struct sockaddr_in *)&addrs[1]; 2179 break; 2180 } 2181 error = sa6_embedscope(fin6, V_ip6_use_defzone); 2182 if (error) 2183 return (error); 2184 error = sa6_embedscope(lin6, V_ip6_use_defzone); 2185 if (error) 2186 return (error); 2187 break; 2188 #endif 2189 case AF_INET: 2190 fin = (struct sockaddr_in *)&addrs[0]; 2191 lin = (struct sockaddr_in *)&addrs[1]; 2192 if (fin->sin_len != sizeof(struct sockaddr_in) || 2193 lin->sin_len != sizeof(struct sockaddr_in)) 2194 return (EINVAL); 2195 break; 2196 default: 2197 return (EINVAL); 2198 } 2199 INP_INFO_WLOCK(&V_tcbinfo); 2200 switch (addrs[0].ss_family) { 2201 #ifdef INET6 2202 case AF_INET6: 2203 inp = in6_pcblookup_hash(&V_tcbinfo, &fin6->sin6_addr, 2204 fin6->sin6_port, &lin6->sin6_addr, lin6->sin6_port, 0, 2205 NULL); 2206 break; 2207 #endif 2208 case AF_INET: 2209 inp = in_pcblookup_hash(&V_tcbinfo, fin->sin_addr, 2210 fin->sin_port, lin->sin_addr, lin->sin_port, 0, NULL); 2211 break; 2212 } 2213 if (inp != NULL) { 2214 INP_WLOCK(inp); 2215 if (inp->inp_flags & INP_TIMEWAIT) { 2216 /* 2217 * XXXRW: There currently exists a state where an 2218 * inpcb is present, but its timewait state has been 2219 * discarded. For now, don't allow dropping of this 2220 * type of inpcb. 2221 */ 2222 tw = intotw(inp); 2223 if (tw != NULL) 2224 tcp_twclose(tw, 0); 2225 else 2226 INP_WUNLOCK(inp); 2227 } else if (!(inp->inp_flags & INP_DROPPED) && 2228 !(inp->inp_socket->so_options & SO_ACCEPTCONN)) { 2229 tp = intotcpcb(inp); 2230 tp = tcp_drop(tp, ECONNABORTED); 2231 if (tp != NULL) 2232 INP_WUNLOCK(inp); 2233 } else 2234 INP_WUNLOCK(inp); 2235 } else 2236 error = ESRCH; 2237 INP_INFO_WUNLOCK(&V_tcbinfo); 2238 return (error); 2239 } 2240 2241 SYSCTL_PROC(_net_inet_tcp, TCPCTL_DROP, drop, 2242 CTLTYPE_STRUCT|CTLFLAG_WR|CTLFLAG_SKIP, NULL, 2243 0, sysctl_drop, "", "Drop TCP connection"); 2244 2245 /* 2246 * Generate a standardized TCP log line for use throughout the 2247 * tcp subsystem. Memory allocation is done with M_NOWAIT to 2248 * allow use in the interrupt context. 2249 * 2250 * NB: The caller MUST free(s, M_TCPLOG) the returned string. 2251 * NB: The function may return NULL if memory allocation failed. 2252 * 2253 * Due to header inclusion and ordering limitations the struct ip 2254 * and ip6_hdr pointers have to be passed as void pointers. 2255 */ 2256 char * 2257 tcp_log_addrs(struct in_conninfo *inc, struct tcphdr *th, void *ip4hdr, 2258 const void *ip6hdr) 2259 { 2260 char *s, *sp; 2261 size_t size; 2262 struct ip *ip; 2263 #ifdef INET6 2264 const struct ip6_hdr *ip6; 2265 2266 ip6 = (const struct ip6_hdr *)ip6hdr; 2267 #endif /* INET6 */ 2268 ip = (struct ip *)ip4hdr; 2269 2270 /* 2271 * The log line looks like this: 2272 * "TCP: [1.2.3.4]:50332 to [1.2.3.4]:80 tcpflags 0x2<SYN>" 2273 */ 2274 size = sizeof("TCP: []:12345 to []:12345 tcpflags 0x2<>") + 2275 sizeof(PRINT_TH_FLAGS) + 1 + 2276 #ifdef INET6 2277 2 * INET6_ADDRSTRLEN; 2278 #else 2279 2 * INET_ADDRSTRLEN; 2280 #endif /* INET6 */ 2281 2282 /* Is logging enabled? */ 2283 if (tcp_log_debug == 0 && tcp_log_in_vain == 0) 2284 return (NULL); 2285 2286 s = malloc(size, M_TCPLOG, M_ZERO|M_NOWAIT); 2287 if (s == NULL) 2288 return (NULL); 2289 2290 strcat(s, "TCP: ["); 2291 sp = s + strlen(s); 2292 2293 if (inc && ((inc->inc_flags & INC_ISIPV6) == 0)) { 2294 inet_ntoa_r(inc->inc_faddr, sp); 2295 sp = s + strlen(s); 2296 sprintf(sp, "]:%i to [", ntohs(inc->inc_fport)); 2297 sp = s + strlen(s); 2298 inet_ntoa_r(inc->inc_laddr, sp); 2299 sp = s + strlen(s); 2300 sprintf(sp, "]:%i", ntohs(inc->inc_lport)); 2301 #ifdef INET6 2302 } else if (inc) { 2303 ip6_sprintf(sp, &inc->inc6_faddr); 2304 sp = s + strlen(s); 2305 sprintf(sp, "]:%i to [", ntohs(inc->inc_fport)); 2306 sp = s + strlen(s); 2307 ip6_sprintf(sp, &inc->inc6_laddr); 2308 sp = s + strlen(s); 2309 sprintf(sp, "]:%i", ntohs(inc->inc_lport)); 2310 } else if (ip6 && th) { 2311 ip6_sprintf(sp, &ip6->ip6_src); 2312 sp = s + strlen(s); 2313 sprintf(sp, "]:%i to [", ntohs(th->th_sport)); 2314 sp = s + strlen(s); 2315 ip6_sprintf(sp, &ip6->ip6_dst); 2316 sp = s + strlen(s); 2317 sprintf(sp, "]:%i", ntohs(th->th_dport)); 2318 #endif /* INET6 */ 2319 } else if (ip && th) { 2320 inet_ntoa_r(ip->ip_src, sp); 2321 sp = s + strlen(s); 2322 sprintf(sp, "]:%i to [", ntohs(th->th_sport)); 2323 sp = s + strlen(s); 2324 inet_ntoa_r(ip->ip_dst, sp); 2325 sp = s + strlen(s); 2326 sprintf(sp, "]:%i", ntohs(th->th_dport)); 2327 } else { 2328 free(s, M_TCPLOG); 2329 return (NULL); 2330 } 2331 sp = s + strlen(s); 2332 if (th) 2333 sprintf(sp, " tcpflags 0x%b", th->th_flags, PRINT_TH_FLAGS); 2334 if (*(s + size - 1) != '\0') 2335 panic("%s: string too long", __func__); 2336 return (s); 2337 } 2338