The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/netinet/tcp_var.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: tcp_var.h,v 1.198 2022/10/28 05:18:39 ozaki-r Exp $    */
    2 
    3 /*
    4  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
    5  * All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. Neither the name of the project nor the names of its contributors
   16  *    may be used to endorse or promote products derived from this software
   17  *    without specific prior written permission.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
   20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
   23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   29  * SUCH DAMAGE.
   30  */
   31 
   32 /*
   33  *      @(#)COPYRIGHT   1.1 (NRL) 17 January 1995
   34  *
   35  * NRL grants permission for redistribution and use in source and binary
   36  * forms, with or without modification, of the software and documentation
   37  * created at NRL provided that the following conditions are met:
   38  *
   39  * 1. Redistributions of source code must retain the above copyright
   40  *    notice, this list of conditions and the following disclaimer.
   41  * 2. Redistributions in binary form must reproduce the above copyright
   42  *    notice, this list of conditions and the following disclaimer in the
   43  *    documentation and/or other materials provided with the distribution.
   44  * 3. All advertising materials mentioning features or use of this software
   45  *    must display the following acknowledgements:
   46  *      This product includes software developed by the University of
   47  *      California, Berkeley and its contributors.
   48  *      This product includes software developed at the Information
   49  *      Technology Division, US Naval Research Laboratory.
   50  * 4. Neither the name of the NRL nor the names of its contributors
   51  *    may be used to endorse or promote products derived from this software
   52  *    without specific prior written permission.
   53  *
   54  * THE SOFTWARE PROVIDED BY NRL IS PROVIDED BY NRL AND CONTRIBUTORS ``AS
   55  * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   56  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
   57  * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL NRL OR
   58  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   59  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   60  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   61  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   62  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   63  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   64  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   65  *
   66  * The views and conclusions contained in the software and documentation
   67  * are those of the authors and should not be interpreted as representing
   68  * official policies, either expressed or implied, of the US Naval
   69  * Research Laboratory (NRL).
   70  */
   71 
   72 /*-
   73  * Copyright (c) 1997, 1998, 1999, 2001, 2005 The NetBSD Foundation, Inc.
   74  * All rights reserved.
   75  *
   76  * This code is derived from software contributed to The NetBSD Foundation
   77  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
   78  * NASA Ames Research Center.
   79  * This code is derived from software contributed to The NetBSD Foundation
   80  * by Charles M. Hannum.
   81  *
   82  * Redistribution and use in source and binary forms, with or without
   83  * modification, are permitted provided that the following conditions
   84  * are met:
   85  * 1. Redistributions of source code must retain the above copyright
   86  *    notice, this list of conditions and the following disclaimer.
   87  * 2. Redistributions in binary form must reproduce the above copyright
   88  *    notice, this list of conditions and the following disclaimer in the
   89  *    documentation and/or other materials provided with the distribution.
   90  *
   91  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   92  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   93  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   94  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   95  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   96  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   97  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   98  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   99  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  100  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  101  * POSSIBILITY OF SUCH DAMAGE.
  102  */
  103 
  104 /*
  105  * Copyright (c) 1982, 1986, 1993, 1994, 1995
  106  *      The Regents of the University of California.  All rights reserved.
  107  *
  108  * Redistribution and use in source and binary forms, with or without
  109  * modification, are permitted provided that the following conditions
  110  * are met:
  111  * 1. Redistributions of source code must retain the above copyright
  112  *    notice, this list of conditions and the following disclaimer.
  113  * 2. Redistributions in binary form must reproduce the above copyright
  114  *    notice, this list of conditions and the following disclaimer in the
  115  *    documentation and/or other materials provided with the distribution.
  116  * 3. Neither the name of the University nor the names of its contributors
  117  *    may be used to endorse or promote products derived from this software
  118  *    without specific prior written permission.
  119  *
  120  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  121  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  122  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  123  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  124  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  125  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  126  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  127  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  128  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  129  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  130  * SUCH DAMAGE.
  131  *
  132  *      @(#)tcp_var.h   8.4 (Berkeley) 5/24/95
  133  */
  134 
  135 #ifndef _NETINET_TCP_VAR_H_
  136 #define _NETINET_TCP_VAR_H_
  137 
  138 #if defined(_KERNEL_OPT)
  139 #include "opt_inet.h"
  140 #include "opt_mbuftrace.h"
  141 
  142 #endif
  143 
  144 /*
  145  * TCP kernel structures and variables.
  146  */
  147 
  148 #include <sys/callout.h>
  149 
  150 #ifdef TCP_SIGNATURE
  151 /*
  152  * Defines which are needed by the xform_tcp module and tcp_[in|out]put
  153  * for SADB verification and lookup.
  154  */
  155 #define TCP_SIGLEN      16      /* length of computed digest in bytes */
  156 #define TCP_KEYLEN_MIN  1       /* minimum length of TCP-MD5 key */
  157 #define TCP_KEYLEN_MAX  80      /* maximum length of TCP-MD5 key */
  158 /*
  159  * Only a single SA per host may be specified at this time. An SPI is
  160  * needed in order for the KEY_LOOKUP_SA() lookup to work.
  161  */
  162 #define TCP_SIG_SPI     0x1000
  163 #endif /* TCP_SIGNATURE */
  164 
  165 /*
  166  * Tcp+ip header, after ip options removed.
  167  */
  168 struct tcpiphdr {
  169         struct ipovly ti_i;             /* overlaid ip structure */
  170         struct tcphdr ti_t;             /* tcp header */
  171 };
  172 #ifdef CTASSERT
  173 CTASSERT(sizeof(struct tcpiphdr) == 40);
  174 #endif
  175 #define ti_x1           ti_i.ih_x1
  176 #define ti_pr           ti_i.ih_pr
  177 #define ti_len          ti_i.ih_len
  178 #define ti_src          ti_i.ih_src
  179 #define ti_dst          ti_i.ih_dst
  180 #define ti_sport        ti_t.th_sport
  181 #define ti_dport        ti_t.th_dport
  182 #define ti_seq          ti_t.th_seq
  183 #define ti_ack          ti_t.th_ack
  184 #define ti_x2           ti_t.th_x2
  185 #define ti_off          ti_t.th_off
  186 #define ti_flags        ti_t.th_flags
  187 #define ti_win          ti_t.th_win
  188 #define ti_sum          ti_t.th_sum
  189 #define ti_urp          ti_t.th_urp
  190 
  191 /*
  192  * SACK option block.
  193  */
  194 struct sackblk {
  195         tcp_seq left;           /* Left edge of sack block. */
  196         tcp_seq right;          /* Right edge of sack block. */
  197 };
  198 
  199 TAILQ_HEAD(sackhead, sackhole);
  200 struct sackhole {
  201         tcp_seq start;
  202         tcp_seq end;
  203         tcp_seq rxmit;
  204 
  205         TAILQ_ENTRY(sackhole) sackhole_q;
  206 };
  207 
  208 struct syn_cache;
  209 
  210 /*
  211  * Tcp control block, one per tcp; fields:
  212  */
  213 struct tcpcb {
  214         int     t_family;               /* address family on the wire */
  215         struct ipqehead segq;           /* sequencing queue */
  216         int     t_segqlen;              /* length of the above */
  217         callout_t t_timer[TCPT_NTIMERS];/* tcp timers */
  218         short   t_state;                /* state of this connection */
  219         short   t_rxtshift;             /* log(2) of rexmt exp. backoff */
  220         uint32_t t_rxtcur;              /* current retransmit value */
  221         short   t_dupacks;              /* consecutive dup acks recd */
  222         /*
  223          * t_partialacks:
  224          *      <0      not in fast recovery.
  225          *      ==0     in fast recovery.  has not received partial acks
  226          *      >0      in fast recovery.  has received partial acks
  227          */
  228         short   t_partialacks;          /* partials acks during fast rexmit */
  229         u_short t_peermss;              /* peer's maximum segment size */
  230         u_short t_ourmss;               /* our's maximum segment size */
  231         u_short t_segsz;                /* current segment size in use */
  232         char    t_force;                /* 1 if forcing out a byte */
  233         u_int   t_flags;
  234 #define TF_ACKNOW       0x0001          /* ack peer immediately */
  235 #define TF_DELACK       0x0002          /* ack, but try to delay it */
  236 #define TF_NODELAY      0x0004          /* don't delay packets to coalesce */
  237 #define TF_NOOPT        0x0008          /* don't use tcp options */
  238 #define TF_REQ_SCALE    0x0020          /* have/will request window scaling */
  239 #define TF_RCVD_SCALE   0x0040          /* other side has requested scaling */
  240 #define TF_REQ_TSTMP    0x0080          /* have/will request timestamps */
  241 #define TF_RCVD_TSTMP   0x0100          /* a timestamp was received in SYN */
  242 #define TF_SACK_PERMIT  0x0200          /* other side said I could SACK */
  243 #define TF_SYN_REXMT    0x0400          /* rexmit timer fired on SYN */
  244 #define TF_WILL_SACK    0x0800          /* try to use SACK */
  245 #define TF_REASSEMBLING 0x1000          /* we're busy reassembling */
  246 #define TF_DEAD         0x2000          /* dead and to-be-released */
  247 #define TF_PMTUD_PEND   0x4000          /* Path MTU Discovery pending */
  248 #define TF_ECN_PERMIT   0x10000         /* other side said is ECN-ready */
  249 #define TF_ECN_SND_CWR  0x20000         /* ECN CWR in queue */
  250 #define TF_ECN_SND_ECE  0x40000         /* ECN ECE in queue */
  251 #define TF_SIGNATURE    0x400000        /* require MD5 digests (RFC2385) */
  252 
  253 
  254         struct  mbuf *t_template;       /* skeletal packet for transmit */
  255         struct  inpcb *t_inpcb;         /* back pointer to internet pcb */
  256         callout_t t_delack_ch;          /* delayed ACK callout */
  257 /*
  258  * The following fields are used as in the protocol specification.
  259  * See RFC793, Dec. 1981, page 21.
  260  */
  261 /* send sequence variables */
  262         tcp_seq snd_una;                /* send unacknowledged */
  263         tcp_seq snd_nxt;                /* send next */
  264         tcp_seq snd_up;                 /* send urgent pointer */
  265         tcp_seq snd_wl1;                /* window update seg seq number */
  266         tcp_seq snd_wl2;                /* window update seg ack number */
  267         tcp_seq iss;                    /* initial send sequence number */
  268         u_long  snd_wnd;                /* send window */
  269 /*
  270  * snd_recover
  271  *      it's basically same as the "recover" variable in RFC 2852 (NewReno).
  272  *      when entering fast retransmit, it's set to snd_max.
  273  *      newreno uses this to detect partial ack.
  274  * snd_high
  275  *      it's basically same as the "send_high" variable in RFC 2852 (NewReno).
  276  *      on each RTO, it's set to snd_max.
  277  *      newreno uses this to avoid false fast retransmits.
  278  */
  279         tcp_seq snd_recover;
  280         tcp_seq snd_high;
  281 /* receive sequence variables */
  282         u_long  rcv_wnd;                /* receive window */
  283         tcp_seq rcv_nxt;                /* receive next */
  284         tcp_seq rcv_up;                 /* receive urgent pointer */
  285         tcp_seq irs;                    /* initial receive sequence number */
  286 /*
  287  * Additional variables for this implementation.
  288  */
  289 /* receive variables */
  290         tcp_seq rcv_adv;                /* advertised window */
  291 
  292 /*
  293  * retransmit variables
  294  *
  295  * snd_max
  296  *      the highest sequence number we've ever sent.
  297  *      used to recognize retransmits.
  298  */
  299         tcp_seq snd_max;
  300 
  301 /* congestion control (for slow start, source quench, retransmit after loss) */
  302         u_long  snd_cwnd;               /* congestion-controlled window */
  303         u_long  snd_ssthresh;           /* snd_cwnd size threshold for
  304                                          * for slow start exponential to
  305                                          * linear switch
  306                                          */
  307 /* auto-sizing variables */
  308         u_int rfbuf_cnt;                /* recv buffer autoscaling byte count */
  309         uint32_t rfbuf_ts;              /* recv buffer autoscaling timestamp */
  310 
  311 /*
  312  * transmit timing stuff.  See below for scale of srtt and rttvar.
  313  * "Variance" is actually smoothed difference.
  314  */
  315         uint32_t t_rcvtime;             /* time last segment received */
  316         uint32_t t_rtttime;             /* time we started measuring rtt */
  317         tcp_seq t_rtseq;                /* sequence number being timed */
  318         int32_t t_srtt;                 /* smoothed round-trip time */
  319         int32_t t_rttvar;               /* variance in round-trip time */
  320         uint32_t t_rttmin;              /* minimum rtt allowed */
  321         u_long  max_sndwnd;             /* largest window peer has offered */
  322 
  323 /* out-of-band data */
  324         char    t_oobflags;             /* have some */
  325         char    t_iobc;                 /* input character */
  326 #define TCPOOB_HAVEDATA 0x01
  327 #define TCPOOB_HADDATA  0x02
  328         short   t_softerror;            /* possible error not yet reported */
  329 
  330 /* RFC 1323 variables */
  331         u_char  snd_scale;              /* window scaling for send window */
  332         u_char  rcv_scale;              /* window scaling for recv window */
  333         u_char  request_r_scale;        /* pending window scaling */
  334         u_char  requested_s_scale;
  335         u_int32_t ts_recent;            /* timestamp echo data */
  336         u_int32_t ts_recent_age;        /* when last updated */
  337         u_int32_t ts_timebase;          /* our timebase */
  338         tcp_seq last_ack_sent;
  339 
  340 /* RFC 3465 variables */
  341         u_long  t_bytes_acked;          /* ABC "bytes_acked" parameter */
  342 
  343 /* SACK stuff */
  344 #define TCP_SACK_MAX 3
  345 #define TCPSACK_NONE 0
  346 #define TCPSACK_HAVED 1
  347         u_char rcv_sack_flags;          /* SACK flags. */
  348         struct sackblk rcv_dsack_block; /* RX D-SACK block. */
  349         struct ipqehead timeq;          /* time sequenced queue. */
  350         struct sackhead snd_holes;      /* TX SACK holes. */
  351         int     snd_numholes;           /* Number of TX SACK holes. */
  352         tcp_seq rcv_lastsack;           /* last seq number(+1) sack'd by rcv'r*/
  353         tcp_seq sack_newdata;           /* New data xmitted in this recovery
  354                                            episode starts at this seq number*/
  355         tcp_seq snd_fack;               /* FACK TCP.  Forward-most data held by
  356                                            peer. */
  357 
  358 /* CUBIC variables */
  359         ulong snd_cubic_wmax;           /* W_max */
  360         ulong snd_cubic_wmax_last;      /* Used for fast convergence */
  361         ulong snd_cubic_ctime;          /* Last congestion time */
  362 
  363 /* pointer for syn cache entries*/
  364         LIST_HEAD(, syn_cache) t_sc;    /* list of entries by this tcb */
  365 
  366 /* prediction of next mbuf when using large window sizes */
  367         struct  mbuf *t_lastm;          /* last mbuf that data was sent from */
  368         int     t_inoff;                /* data offset in previous mbuf */
  369         int     t_lastoff;              /* last data address in mbuf chain */
  370         int     t_lastlen;              /* last length read from mbuf chain */
  371 
  372 /* Path-MTU discovery blackhole detection */
  373         int t_mtudisc;                  /* perform mtudisc for this tcb */
  374 /* Path-MTU Discovery Information */
  375         u_int   t_pmtud_mss_acked;      /* MSS acked, lower bound for MTU */
  376         u_int   t_pmtud_mtu_sent;       /* MTU used, upper bound for MTU */
  377         tcp_seq t_pmtud_th_seq;         /* TCP SEQ from ICMP payload */
  378         u_int   t_pmtud_nextmtu;        /* Advertised Next-Hop MTU from ICMP */
  379         u_short t_pmtud_ip_len;         /* IP length from ICMP payload */
  380         u_short t_pmtud_ip_hl;          /* IP header length from ICMP payload */
  381 
  382         uint8_t t_ecn_retries;          /* # of ECN setup retries */
  383         
  384         const struct tcp_congctl *t_congctl;    /* per TCB congctl algorithm */
  385 
  386         /* Keepalive per socket */
  387         u_int   t_keepinit;
  388         u_int   t_keepidle;
  389         u_int   t_keepintvl;
  390         u_int   t_keepcnt;
  391         u_int   t_maxidle;              /* t_keepcnt * t_keepintvl */
  392 
  393         u_int   t_msl;                  /* MSL to use for this connexion */
  394 
  395         /* maintain a few stats per connection: */
  396         uint32_t t_rcvoopack;           /* out-of-order packets received */
  397         uint32_t t_sndrexmitpack;       /* retransmit packets sent */
  398         uint32_t t_sndzerowin;          /* zero-window updates sent */
  399 };
  400 
  401 /*
  402  * Macros to aid ECN TCP.
  403  */
  404 #define TCP_ECN_ALLOWED(tp)     (tp->t_flags & TF_ECN_PERMIT)
  405 
  406 /*
  407  * Macros to aid SACK/FACK TCP.
  408  */
  409 #define TCP_SACK_ENABLED(tp)    (tp->t_flags & TF_WILL_SACK)
  410 #define TCP_FACK_FASTRECOV(tp)  \
  411         (TCP_SACK_ENABLED(tp) && \
  412         (SEQ_GT(tp->snd_fack, tp->snd_una + tcprexmtthresh * tp->t_segsz)))
  413 
  414 #ifdef _KERNEL
  415 /*
  416  * TCP reassembly queue locks.
  417  */
  418 static __inline int tcp_reass_lock_try (struct tcpcb *)
  419         __unused;
  420 static __inline void tcp_reass_unlock (struct tcpcb *)
  421         __unused;
  422 
  423 static __inline int
  424 tcp_reass_lock_try(struct tcpcb *tp)
  425 {
  426         int s;
  427 
  428         /*
  429          * Use splvm() -- we're blocking things that would cause
  430          * mbuf allocation.
  431          */
  432         s = splvm();
  433         if (tp->t_flags & TF_REASSEMBLING) {
  434                 splx(s);
  435                 return (0);
  436         }
  437         tp->t_flags |= TF_REASSEMBLING;
  438         splx(s);
  439         return (1);
  440 }
  441 
  442 static __inline void
  443 tcp_reass_unlock(struct tcpcb *tp)
  444 {
  445         int s;
  446 
  447         s = splvm();
  448         KASSERT((tp->t_flags & TF_REASSEMBLING) != 0);
  449         tp->t_flags &= ~TF_REASSEMBLING;
  450         splx(s);
  451 }
  452 
  453 #ifdef DIAGNOSTIC
  454 #define TCP_REASS_LOCK(tp)                                              \
  455 do {                                                                    \
  456         if (tcp_reass_lock_try(tp) == 0) {                              \
  457                 printf("%s:%d: tcpcb %p reass already locked\n",        \
  458                     __FILE__, __LINE__, tp);                            \
  459                 panic("tcp_reass_lock");                                \
  460         }                                                               \
  461 } while (/*CONSTCOND*/ 0)
  462 #define TCP_REASS_LOCK_CHECK(tp)                                        \
  463 do {                                                                    \
  464         if (((tp)->t_flags & TF_REASSEMBLING) == 0) {                   \
  465                 printf("%s:%d: tcpcb %p reass lock not held\n",         \
  466                     __FILE__, __LINE__, tp);                            \
  467                 panic("tcp reass lock check");                          \
  468         }                                                               \
  469 } while (/*CONSTCOND*/ 0)
  470 #else
  471 #define TCP_REASS_LOCK(tp)      (void) tcp_reass_lock_try((tp))
  472 #define TCP_REASS_LOCK_CHECK(tp) /* nothing */
  473 #endif
  474 
  475 #define TCP_REASS_UNLOCK(tp)    tcp_reass_unlock((tp))
  476 #endif /* _KERNEL */
  477 
  478 /*
  479  * Queue for delayed ACK processing.
  480  */
  481 #ifdef _KERNEL
  482 extern int tcp_delack_ticks;
  483 void    tcp_delack(void *);
  484 
  485 #define TCP_RESTART_DELACK(tp)                                          \
  486         callout_reset(&(tp)->t_delack_ch, tcp_delack_ticks,             \
  487             tcp_delack, tp)
  488 
  489 #define TCP_SET_DELACK(tp)                                              \
  490 do {                                                                    \
  491         if (((tp)->t_flags & TF_DELACK) == 0) {                         \
  492                 (tp)->t_flags |= TF_DELACK;                             \
  493                 TCP_RESTART_DELACK(tp);                                 \
  494         }                                                               \
  495 } while (/*CONSTCOND*/0)
  496 
  497 #define TCP_CLEAR_DELACK(tp)                                            \
  498 do {                                                                    \
  499         if ((tp)->t_flags & TF_DELACK) {                                \
  500                 (tp)->t_flags &= ~TF_DELACK;                            \
  501                 callout_stop(&(tp)->t_delack_ch);                       \
  502         }                                                               \
  503 } while (/*CONSTCOND*/0)
  504 #endif /* _KERNEL */
  505 
  506 /*
  507  * Compute the current timestamp for a connection.
  508  */
  509 #define TCP_TIMESTAMP(tp)       (tcp_now - (tp)->ts_timebase)
  510 
  511 /*
  512  * Handy way of passing around TCP option info.
  513  */
  514 struct tcp_opt_info {
  515         int             ts_present;
  516         u_int32_t       ts_val;
  517         u_int32_t       ts_ecr;
  518         u_int16_t       maxseg;
  519 };
  520 
  521 #define TOF_SIGNATURE   0x0040          /* signature option present */
  522 #define TOF_SIGLEN      0x0080          /* sigature length valid (RFC2385) */
  523 
  524 #define intotcpcb(ip)   ((struct tcpcb *)(ip)->inp_ppcb)
  525 #define sototcpcb(so)   (intotcpcb(sotoinpcb(so)))
  526 
  527 /*
  528  * See RFC2988 for a discussion of RTO calculation; comments assume
  529  * familiarity with that document.
  530  *
  531  * The smoothed round-trip time and estimated variance are stored as
  532  * fixed point numbers.  Historically, srtt was scaled by
  533  * TCP_RTT_SHIFT bits, and rttvar by TCP_RTTVAR_SHIFT bits.  Because
  534  * the values coincide with the alpha and beta parameters suggested
  535  * for RTO calculation (1/8 for srtt, 1/4 for rttvar), the combination
  536  * of computing 1/8 of the new value and transforming it to the
  537  * fixed-point representation required zero instructions.  However,
  538  * the storage representations no longer coincide with the alpha/beta
  539  * shifts; instead, more fractional bits are present.
  540  *
  541  * The storage representation of srtt is 1/32 slow ticks, or 1/64 s.
  542  * (The assumption that a slow tick is 500 ms should not be present in
  543  * the code.)
  544  *
  545  * The storage representation of rttvar is 1/16 slow ticks, or 1/32 s.
  546  * There may be some confusion about this in the code.
  547  *
  548  * For historical reasons, these scales are also used in smoothing the
  549  * average (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed).
  550  * This results in alpha of 0.125 and beta of 0.25, following RFC2988
  551  * section 2.3
  552  *
  553  * XXX Change SHIFT values to LGWEIGHT and REP_SHIFT, and adjust
  554  * the code to use the correct ones.
  555  */
  556 #define TCP_RTT_SHIFT           3       /* shift for srtt; 3 bits frac. */
  557 #define TCP_RTTVAR_SHIFT        2       /* multiplier for rttvar; 2 bits */
  558 
  559 /*
  560  * Compute TCP retransmission timer, following RFC2988.
  561  * This macro returns a value in slow timeout ticks.
  562  *
  563  * Section 2.2 requires that the RTO value be
  564  *  srtt + max(G, 4*RTTVAR)
  565  * where G is the clock granularity.
  566  *
  567  * This comment has not necessarily been updated for the new storage
  568  * representation:
  569  *
  570  * Because of the way we do the smoothing, srtt and rttvar
  571  * will each average +1/2 tick of bias.  When we compute
  572  * the retransmit timer, we want 1/2 tick of rounding and
  573  * 1 extra tick because of +-1/2 tick uncertainty in the
  574  * firing of the timer.  The bias will give us exactly the
  575  * 1.5 tick we need.  But, because the bias is
  576  * statistical, we have to test that we don't drop below
  577  * the minimum feasible timer (which is 2 ticks).
  578  * This macro assumes that the value of 1<<TCP_RTTVAR_SHIFT
  579  * is the same as the multiplier for rttvar.
  580  *
  581  * This macro appears to be wrong; it should be checking rttvar*4 in
  582  * ticks and making sure we use 1 instead if rttvar*4 rounds to 0.  It
  583  * appears to be treating srtt as being in the old storage
  584  * representation, resulting in a factor of 4 extra.
  585  */
  586 #define TCP_REXMTVAL(tp) \
  587         ((((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) >> 2)
  588 
  589 /*
  590  * Compute the initial window for slow start.
  591  */
  592 #define TCP_INITIAL_WINDOW(iw, segsz) \
  593         uimin((iw) * (segsz), uimax(2 * (segsz), tcp_init_win_max[(iw)]))
  594 
  595 /*
  596  * TCP statistics.
  597  * Each counter is an unsigned 64-bit value.
  598  *
  599  * Many of these should be kept per connection, but that's inconvenient
  600  * at the moment.
  601  */
  602 #define TCP_STAT_CONNATTEMPT    0       /* connections initiated */
  603 #define TCP_STAT_ACCEPTS        1       /* connections accepted */
  604 #define TCP_STAT_CONNECTS       2       /* connections established */
  605 #define TCP_STAT_DROPS          3       /* connections dropped */
  606 #define TCP_STAT_CONNDROPS      4       /* embryonic connections dropped */
  607 #define TCP_STAT_CLOSED         5       /* conn. closed (includes drops) */
  608 #define TCP_STAT_SEGSTIMED      6       /* segs where we tried to get rtt */
  609 #define TCP_STAT_RTTUPDATED     7       /* times we succeeded */
  610 #define TCP_STAT_DELACK         8       /* delayed ACKs sent */
  611 #define TCP_STAT_TIMEOUTDROP    9       /* conn. dropped in rxmt timeout */
  612 #define TCP_STAT_REXMTTIMEO     10      /* retransmit timeouts */
  613 #define TCP_STAT_PERSISTTIMEO   11      /* persist timeouts */
  614 #define TCP_STAT_KEEPTIMEO      12      /* keepalive timeouts */
  615 #define TCP_STAT_KEEPPROBE      13      /* keepalive probes sent */
  616 #define TCP_STAT_KEEPDROPS      14      /* connections dropped in keepalive */
  617 #define TCP_STAT_PERSISTDROPS   15      /* connections dropped in persist */
  618 #define TCP_STAT_CONNSDRAINED   16      /* connections drained due to memory
  619                                            shortage */
  620 #define TCP_STAT_PMTUBLACKHOLE  17      /* PMTUD blackhole detected */
  621 #define TCP_STAT_SNDTOTAL       18      /* total packets sent */
  622 #define TCP_STAT_SNDPACK        19      /* data packlets sent */
  623 #define TCP_STAT_SNDBYTE        20      /* data bytes sent */
  624 #define TCP_STAT_SNDREXMITPACK  21      /* data packets retransmitted */
  625 #define TCP_STAT_SNDREXMITBYTE  22      /* data bytes retransmitted */
  626 #define TCP_STAT_SNDACKS        23      /* ACK-only packets sent */
  627 #define TCP_STAT_SNDPROBE       24      /* window probes sent */
  628 #define TCP_STAT_SNDURG         25      /* packets sent with URG only */
  629 #define TCP_STAT_SNDWINUP       26      /* window update-only packets sent */
  630 #define TCP_STAT_SNDCTRL        27      /* control (SYN|FIN|RST) packets sent */
  631 #define TCP_STAT_RCVTOTAL       28      /* total packets received */
  632 #define TCP_STAT_RCVPACK        29      /* packets received in sequence */
  633 #define TCP_STAT_RCVBYTE        30      /* bytes received in sequence */
  634 #define TCP_STAT_RCVBADSUM      31      /* packets received with cksum errs */
  635 #define TCP_STAT_RCVBADOFF      32      /* packets received with bad offset */
  636 #define TCP_STAT_RCVMEMDROP     33      /* packets dropped for lack of memory */
  637 #define TCP_STAT_RCVSHORT       34      /* packets received too short */
  638 #define TCP_STAT_RCVDUPPACK     35      /* duplicate-only packets received */
  639 #define TCP_STAT_RCVDUPBYTE     36      /* duplicate-only bytes received */
  640 #define TCP_STAT_RCVPARTDUPPACK 37      /* packets with some duplicate data */
  641 #define TCP_STAT_RCVPARTDUPBYTE 38      /* dup. bytes in part-dup. packets */
  642 #define TCP_STAT_RCVOOPACK      39      /* out-of-order packets received */
  643 #define TCP_STAT_RCVOOBYTE      40      /* out-of-order bytes received */
  644 #define TCP_STAT_RCVPACKAFTERWIN 41     /* packets with data after window */
  645 #define TCP_STAT_RCVBYTEAFTERWIN 42     /* bytes received after window */
  646 #define TCP_STAT_RCVAFTERCLOSE  43      /* packets received after "close" */
  647 #define TCP_STAT_RCVWINPROBE    44      /* rcvd window probe packets */
  648 #define TCP_STAT_RCVDUPACK      45      /* rcvd duplicate ACKs */
  649 #define TCP_STAT_RCVACKTOOMUCH  46      /* rcvd ACKs for unsent data */
  650 #define TCP_STAT_RCVACKPACK     47      /* rcvd ACK packets */
  651 #define TCP_STAT_RCVACKBYTE     48      /* bytes ACKed by rcvd ACKs */
  652 #define TCP_STAT_RCVWINUPD      49      /* rcvd window update packets */
  653 #define TCP_STAT_PAWSDROP       50      /* segments dropped due to PAWS */
  654 #define TCP_STAT_PREDACK        51      /* times hdr predict OK for ACKs */
  655 #define TCP_STAT_PREDDAT        52      /* times hdr predict OK for data pkts */
  656 #define TCP_STAT_PCBHASHMISS    53      /* input packets missing PCB hash */
  657 #define TCP_STAT_NOPORT         54      /* no socket on port */
  658 #define TCP_STAT_BADSYN         55      /* received ACK for which we have
  659                                            no SYN in compressed state */
  660 #define TCP_STAT_DELAYED_FREE   56      /* delayed pool_put() of tcpcb */
  661 #define TCP_STAT_SC_ADDED       57      /* # of sc entries added */
  662 #define TCP_STAT_SC_COMPLETED   58      /* # of sc connections completed */
  663 #define TCP_STAT_SC_TIMED_OUT   59      /* # of sc entries timed out */
  664 #define TCP_STAT_SC_OVERFLOWED  60      /* # of sc drops due to overflow */
  665 #define TCP_STAT_SC_RESET       61      /* # of sc drops due to RST */
  666 #define TCP_STAT_SC_UNREACH     62      /* # of sc drops due to ICMP unreach */
  667 #define TCP_STAT_SC_BUCKETOVERFLOW 63   /* # of sc drops due to bucket ovflow */
  668 #define TCP_STAT_SC_ABORTED     64      /* # of sc entries aborted (no mem) */
  669 #define TCP_STAT_SC_DUPESYN     65      /* # of duplicate SYNs received */
  670 #define TCP_STAT_SC_DROPPED     66      /* # of SYNs dropped (no route/mem) */
  671 #define TCP_STAT_SC_COLLISIONS  67      /* # of sc hash collisions */
  672 #define TCP_STAT_SC_RETRANSMITTED 68    /* # of sc retransmissions */
  673 #define TCP_STAT_SC_DELAYED_FREE 69     /* # of delayed pool_put()s */
  674 #define TCP_STAT_SELFQUENCH     70      /* # of ENOBUFS we get on output */
  675 #define TCP_STAT_BADSIG         71      /* # of drops due to bad signature */
  676 #define TCP_STAT_GOODSIG        72      /* # of packets with good signature */
  677 #define TCP_STAT_ECN_SHS        73      /* # of successful ECN handshakes */
  678 #define TCP_STAT_ECN_CE         74      /* # of packets with CE bit */
  679 #define TCP_STAT_ECN_ECT        75      /* # of packets with ECT(0) bit */
  680 
  681 #define TCP_NSTATS              76
  682 
  683 /*
  684  * Names for TCP sysctl objects.
  685  */
  686 #define TCPCTL_RFC1323          1       /* RFC1323 timestamps/scaling */
  687 #define TCPCTL_SENDSPACE        2       /* default send buffer */
  688 #define TCPCTL_RECVSPACE        3       /* default recv buffer */
  689 #define TCPCTL_MSSDFLT          4       /* default seg size */
  690 #define TCPCTL_SYN_CACHE_LIMIT  5       /* max size of comp. state engine */
  691 #define TCPCTL_SYN_BUCKET_LIMIT 6       /* max size of hash bucket */
  692 #if 0   /*obsoleted*/
  693 #define TCPCTL_SYN_CACHE_INTER  7       /* interval of comp. state timer */
  694 #endif
  695 #define TCPCTL_INIT_WIN         8       /* initial window */
  696 #define TCPCTL_MSS_IFMTU        9       /* mss from interface, not in_maxmtu */
  697 #define TCPCTL_SACK             10      /* RFC2018 selective acknowledgement */
  698 #define TCPCTL_WSCALE           11      /* RFC1323 window scaling */
  699 #define TCPCTL_TSTAMP           12      /* RFC1323 timestamps */
  700 #if 0   /*obsoleted*/
  701 #define TCPCTL_COMPAT_42        13      /* 4.2BSD TCP bug work-arounds */
  702 #endif
  703 #define TCPCTL_CWM              14      /* Congestion Window Monitoring */
  704 #define TCPCTL_CWM_BURSTSIZE    15      /* burst size allowed by CWM */
  705 #define TCPCTL_ACK_ON_PUSH      16      /* ACK immediately on PUSH */
  706 #define TCPCTL_KEEPIDLE         17      /* keepalive idle time */
  707 #define TCPCTL_KEEPINTVL        18      /* keepalive probe interval */
  708 #define TCPCTL_KEEPCNT          19      /* keepalive count */
  709 #define TCPCTL_SLOWHZ           20      /* PR_SLOWHZ (read-only) */
  710 #define TCPCTL_NEWRENO          21      /* NewReno Congestion Control */
  711 #define TCPCTL_LOG_REFUSED      22      /* Log refused connections */
  712 #if 0   /*obsoleted*/
  713 #define TCPCTL_RSTRATELIMIT     23      /* RST rate limit */
  714 #endif
  715 #define TCPCTL_RSTPPSLIMIT      24      /* RST pps limit */
  716 #define TCPCTL_DELACK_TICKS     25      /* # ticks to delay ACK */
  717 #define TCPCTL_INIT_WIN_LOCAL   26      /* initial window for local nets */
  718 #define TCPCTL_IDENT            27      /* rfc 931 identd */
  719 #define TCPCTL_ACKDROPRATELIMIT 28      /* SYN/RST -> ACK rate limit */
  720 #define TCPCTL_LOOPBACKCKSUM    29      /* do TCP checksum on loopback */
  721 #define TCPCTL_STATS            30      /* TCP statistics */
  722 #define TCPCTL_DEBUG            31      /* TCP debug sockets */
  723 #define TCPCTL_DEBX             32      /* # of tcp debug sockets */
  724 #define TCPCTL_DROP             33      /* drop tcp connection */
  725 #define TCPCTL_MSL              34      /* Max Segment Life */
  726 
  727 #ifdef _KERNEL
  728 
  729 extern  struct inpcbtable tcbtable;     /* head of queue of active tcpcb's */
  730 extern  const struct pr_usrreqs tcp_usrreqs;
  731 
  732 extern  u_int32_t tcp_now;      /* for RFC 1323 timestamps */
  733 extern  int tcp_do_rfc1323;     /* enabled/disabled? */
  734 extern  int tcp_do_sack;        /* SACK enabled/disabled? */
  735 extern  int tcp_do_win_scale;   /* RFC1323 window scaling enabled/disabled? */
  736 extern  int tcp_do_timestamps;  /* RFC1323 timestamps enabled/disabled? */
  737 extern  int tcp_mssdflt;        /* default seg size */
  738 extern  int tcp_minmss;         /* minimal seg size */
  739 extern  int tcp_msl;            /* max segment life */
  740 extern  int tcp_init_win;       /* initial window */
  741 extern  int tcp_init_win_local; /* initial window for local nets */
  742 extern  int tcp_init_win_max[11];/* max sizes for values of tcp_init_win_* */
  743 extern  int tcp_mss_ifmtu;      /* take MSS from interface, not in_maxmtu */
  744 extern  int tcp_cwm;            /* enable Congestion Window Monitoring */
  745 extern  int tcp_cwm_burstsize;  /* burst size allowed by CWM */
  746 extern  int tcp_ack_on_push;    /* ACK immediately on PUSH */
  747 extern  int tcp_log_refused;    /* log refused connections */
  748 extern  int tcp_do_ecn;         /* TCP ECN enabled/disabled? */
  749 extern  int tcp_ecn_maxretries; /* Max ECN setup retries */
  750 extern  int tcp_do_rfc1948;     /* ISS by cryptographic hash */
  751 extern int tcp_sack_tp_maxholes;        /* Max holes per connection. */
  752 extern int tcp_sack_globalmaxholes;     /* Max holes per system. */
  753 extern int tcp_sack_globalholes;        /* Number of holes present. */
  754 extern int tcp_do_abc;                  /* RFC3465 ABC enabled/disabled? */
  755 extern int tcp_abc_aggressive;          /* 1: L=2*SMSS  0: L=1*SMSS */
  756 
  757 extern int tcp_msl_enable;              /* enable TIME_WAIT truncation  */
  758 extern int tcp_msl_loop;                /* MSL for loopback             */
  759 extern int tcp_msl_local;               /* MSL for 'local'              */
  760 extern int tcp_msl_remote;              /* MSL otherwise                */
  761 extern int tcp_msl_remote_threshold;    /* RTT threshold                */
  762 extern int tcp_rttlocal;                /* Use RTT to decide who's 'local' */
  763 extern int tcp4_vtw_enable;
  764 extern int tcp6_vtw_enable;
  765 extern int tcp_vtw_was_enabled;
  766 extern int tcp_vtw_entries;
  767 
  768 extern  int tcp_rst_ppslim;
  769 extern  int tcp_ackdrop_ppslim;
  770 
  771 #ifdef MBUFTRACE
  772 extern  struct mowner tcp_rx_mowner;
  773 extern  struct mowner tcp_tx_mowner;
  774 extern  struct mowner tcp_reass_mowner;
  775 extern  struct mowner tcp_sock_mowner;
  776 extern  struct mowner tcp_sock_rx_mowner;
  777 extern  struct mowner tcp_sock_tx_mowner;
  778 extern  struct mowner tcp_mowner;
  779 #endif
  780 
  781 extern int tcp_do_autorcvbuf;
  782 extern int tcp_autorcvbuf_inc;
  783 extern int tcp_autorcvbuf_max;
  784 extern int tcp_do_autosndbuf;
  785 extern int tcp_autosndbuf_inc;
  786 extern int tcp_autosndbuf_max;
  787 
  788 struct secasvar;
  789 
  790 void     tcp_canceltimers(struct tcpcb *);
  791 struct tcpcb *
  792          tcp_close(struct tcpcb *);
  793 int      tcp_isdead(struct tcpcb *);
  794 #ifdef INET6
  795 void     *tcp6_ctlinput(int, const struct sockaddr *, void *);
  796 #endif
  797 void     *tcp_ctlinput(int, const struct sockaddr *, void *);
  798 int      tcp_ctloutput(int, struct socket *, struct sockopt *);
  799 struct tcpcb *
  800          tcp_disconnect1(struct tcpcb *);
  801 struct tcpcb *
  802          tcp_drop(struct tcpcb *, int);
  803 #ifdef TCP_SIGNATURE
  804 int      tcp_signature_apply(void *, void *, u_int);
  805 struct secasvar *tcp_signature_getsav(struct mbuf *);
  806 int      tcp_signature(struct mbuf *, struct tcphdr *, int, struct secasvar *,
  807             char *);
  808 #endif
  809 void     tcp_drain(void);
  810 void     tcp_drainstub(void);
  811 void     tcp_established(struct tcpcb *);
  812 void     tcp_init(void);
  813 void     tcp_init_common(unsigned);
  814 #ifdef INET6
  815 int      tcp6_input(struct mbuf **, int *, int);
  816 #endif
  817 void     tcp_input(struct mbuf *, int, int);
  818 u_int    tcp_hdrsz(struct tcpcb *);
  819 u_long   tcp_mss_to_advertise(const struct ifnet *, int);
  820 void     tcp_mss_from_peer(struct tcpcb *, int);
  821 void     tcp_tcpcb_template(void);
  822 struct tcpcb *
  823          tcp_newtcpcb(int, struct inpcb *);
  824 void     tcp_notify(struct inpcb *, int);
  825 u_int    tcp_optlen(struct tcpcb *);
  826 int      tcp_output(struct tcpcb *);
  827 void     tcp_pulloutofband(struct socket *,
  828             struct tcphdr *, struct mbuf *, int);
  829 void     tcp_quench(struct inpcb *);
  830 void     tcp_mtudisc(struct inpcb *, int);
  831 #ifdef INET6
  832 void     tcp6_mtudisc_callback(struct in6_addr *);
  833 #endif
  834 
  835 void    tcpipqent_init(void);
  836 struct ipqent *tcpipqent_alloc(void);
  837 void     tcpipqent_free(struct ipqent *);
  838 
  839 int      tcp_respond(struct tcpcb *, struct mbuf *, struct mbuf *,
  840             struct tcphdr *, tcp_seq, tcp_seq, int);
  841 void     tcp_rmx_rtt(struct tcpcb *);
  842 void     tcp_setpersist(struct tcpcb *);
  843 #ifdef TCP_SIGNATURE
  844 int      tcp_signature_compute(struct mbuf *, struct tcphdr *, int, int,
  845             int, u_char *, u_int);
  846 #endif
  847 void     tcp_fasttimo(void);
  848 struct mbuf *
  849          tcp_template(struct tcpcb *);
  850 void     tcp_trace(short, short, struct tcpcb *, struct mbuf *, int);
  851 struct tcpcb *
  852          tcp_usrclosed(struct tcpcb *);
  853 void     tcp_usrreq_init(void);
  854 void     tcp_xmit_timer(struct tcpcb *, uint32_t);
  855 tcp_seq  tcp_new_iss(struct tcpcb *);
  856 tcp_seq  tcp_new_iss1(void *, void *, u_int16_t, u_int16_t, size_t);
  857 
  858 void     tcp_sack_init(void);
  859 void     tcp_new_dsack(struct tcpcb *, tcp_seq, u_int32_t);
  860 void     tcp_sack_option(struct tcpcb *, const struct tcphdr *,
  861             const u_char *, int);
  862 void     tcp_del_sackholes(struct tcpcb *, const struct tcphdr *);
  863 void     tcp_free_sackholes(struct tcpcb *);
  864 void     tcp_sack_adjust(struct tcpcb *tp);
  865 struct sackhole *tcp_sack_output(struct tcpcb *tp, int *sack_bytes_rexmt);
  866 int      tcp_sack_numblks(const struct tcpcb *);
  867 #define TCP_SACK_OPTLEN(nblks)  ((nblks) * 8 + 2 + 2)
  868 
  869 void     tcp_statinc(u_int);
  870 void     tcp_statadd(u_int, uint64_t);
  871 
  872 int      tcp_input_checksum(int, struct mbuf *, const struct tcphdr *, int, int,
  873     int);
  874 
  875 int     tcp_dooptions(struct tcpcb *, const u_char *, int,
  876             struct tcphdr *, struct mbuf *, int, struct tcp_opt_info *);
  877 #endif
  878 
  879 #endif /* !_NETINET_TCP_VAR_H_ */

Cache object: ff3d5b54c999e1ee0f461619da958fd9


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.