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.158.4.1 2009/09/26 18:34:29 snj 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 #include "rnd.h"
  142 #endif
  143 
  144 /*
  145  * Kernel variables for tcp.
  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_ALLOCSA() lookup to work.
  161  */
  162 #define TCP_SIG_SPI     0x1000
  163 #endif /* TCP_SIGNATURE */
  164 
  165 /*
  166  * SACK option block.
  167  */
  168 struct sackblk {
  169         tcp_seq left;           /* Left edge of sack block. */
  170         tcp_seq right;          /* Right edge of sack block. */
  171 };
  172 
  173 TAILQ_HEAD(sackhead, sackhole);
  174 struct sackhole {
  175         tcp_seq start;
  176         tcp_seq end;
  177         tcp_seq rxmit;
  178 
  179         TAILQ_ENTRY(sackhole) sackhole_q;
  180 };
  181 
  182 /*
  183  * Tcp control block, one per tcp; fields:
  184  */
  185 struct tcpcb {
  186         int     t_family;               /* address family on the wire */
  187         struct ipqehead segq;           /* sequencing queue */
  188         int     t_segqlen;              /* length of the above */
  189         callout_t t_timer[TCPT_NTIMERS];/* tcp timers */
  190         short   t_state;                /* state of this connection */
  191         short   t_rxtshift;             /* log(2) of rexmt exp. backoff */
  192         uint32_t t_rxtcur;              /* current retransmit value */
  193         short   t_dupacks;              /* consecutive dup acks recd */
  194         short   t_partialacks;          /* partials acks during fast rexmit */
  195         u_short t_peermss;              /* peer's maximum segment size */
  196         u_short t_ourmss;               /* our's maximum segment size */
  197         u_short t_segsz;                /* current segment size in use */
  198         char    t_force;                /* 1 if forcing out a byte */
  199         u_int   t_flags;
  200 #define TF_ACKNOW       0x0001          /* ack peer immediately */
  201 #define TF_DELACK       0x0002          /* ack, but try to delay it */
  202 #define TF_NODELAY      0x0004          /* don't delay packets to coalesce */
  203 #define TF_NOOPT        0x0008          /* don't use tcp options */
  204 #define TF_REQ_SCALE    0x0020          /* have/will request window scaling */
  205 #define TF_RCVD_SCALE   0x0040          /* other side has requested scaling */
  206 #define TF_REQ_TSTMP    0x0080          /* have/will request timestamps */
  207 #define TF_RCVD_TSTMP   0x0100          /* a timestamp was received in SYN */
  208 #define TF_SACK_PERMIT  0x0200          /* other side said I could SACK */
  209 #define TF_SYN_REXMT    0x0400          /* rexmit timer fired on SYN */
  210 #define TF_WILL_SACK    0x0800          /* try to use SACK */
  211 #define TF_REASSEMBLING 0x1000          /* we're busy reassembling */
  212 #define TF_DEAD         0x2000          /* dead and to-be-released */
  213 #define TF_PMTUD_PEND   0x4000          /* Path MTU Discovery pending */
  214 #define TF_ECN_PERMIT   0x10000         /* other side said is ECN-ready */
  215 #define TF_ECN_SND_CWR  0x20000         /* ECN CWR in queue */
  216 #define TF_ECN_SND_ECE  0x40000         /* ECN ECE in queue */
  217 #define TF_SIGNATURE    0x400000        /* require MD5 digests (RFC2385) */
  218 
  219 
  220         struct  mbuf *t_template;       /* skeletal packet for transmit */
  221         struct  inpcb *t_inpcb;         /* back pointer to internet pcb */
  222         struct  in6pcb *t_in6pcb;       /* back pointer to internet pcb */
  223         callout_t t_delack_ch;          /* delayed ACK callout */
  224 /*
  225  * The following fields are used as in the protocol specification.
  226  * See RFC793, Dec. 1981, page 21.
  227  */
  228 /* send sequence variables */
  229         tcp_seq snd_una;                /* send unacknowledged */
  230         tcp_seq snd_nxt;                /* send next */
  231         tcp_seq snd_up;                 /* send urgent pointer */
  232         tcp_seq snd_wl1;                /* window update seg seq number */
  233         tcp_seq snd_wl2;                /* window update seg ack number */
  234         tcp_seq iss;                    /* initial send sequence number */
  235         u_long  snd_wnd;                /* send window */
  236         tcp_seq snd_recover;            /* for use in fast recovery */
  237         tcp_seq snd_high;               /* NewReno false fast rexmit seq */
  238 /* receive sequence variables */
  239         u_long  rcv_wnd;                /* receive window */
  240         tcp_seq rcv_nxt;                /* receive next */
  241         tcp_seq rcv_up;                 /* receive urgent pointer */
  242         tcp_seq irs;                    /* initial receive sequence number */
  243 /*
  244  * Additional variables for this implementation.
  245  */
  246 /* receive variables */
  247         tcp_seq rcv_adv;                /* advertised window */
  248 /* retransmit variables */
  249         tcp_seq snd_max;                /* highest sequence number sent;
  250                                          * used to recognize retransmits
  251                                          */
  252 /* congestion control (for slow start, source quench, retransmit after loss) */
  253         u_long  snd_cwnd;               /* congestion-controlled window */
  254         u_long  snd_ssthresh;           /* snd_cwnd size threshhold for
  255                                          * for slow start exponential to
  256                                          * linear switch
  257                                          */
  258 /* auto-sizing variables */
  259         u_int rfbuf_cnt;                /* recv buffer autoscaling byte count */
  260         uint32_t rfbuf_ts;              /* recv buffer autoscaling timestamp */
  261 
  262 /*
  263  * transmit timing stuff.  See below for scale of srtt and rttvar.
  264  * "Variance" is actually smoothed difference.
  265  */
  266         uint32_t t_rcvtime;             /* time last segment received */
  267         uint32_t t_rtttime;             /* time we started measuring rtt */
  268         tcp_seq t_rtseq;                /* sequence number being timed */
  269         int32_t t_srtt;                 /* smoothed round-trip time */
  270         int32_t t_rttvar;               /* variance in round-trip time */
  271         uint32_t t_rttmin;              /* minimum rtt allowed */
  272         u_long  max_sndwnd;             /* largest window peer has offered */
  273 
  274 /* out-of-band data */
  275         char    t_oobflags;             /* have some */
  276         char    t_iobc;                 /* input character */
  277 #define TCPOOB_HAVEDATA 0x01
  278 #define TCPOOB_HADDATA  0x02
  279         short   t_softerror;            /* possible error not yet reported */
  280 
  281 /* RFC 1323 variables */
  282         u_char  snd_scale;              /* window scaling for send window */
  283         u_char  rcv_scale;              /* window scaling for recv window */
  284         u_char  request_r_scale;        /* pending window scaling */
  285         u_char  requested_s_scale;
  286         u_int32_t ts_recent;            /* timestamp echo data */
  287         u_int32_t ts_recent_age;        /* when last updated */
  288         u_int32_t ts_timebase;          /* our timebase */
  289         tcp_seq last_ack_sent;
  290 
  291 /* RFC 3465 variables */
  292         u_long  t_bytes_acked;          /* ABC "bytes_acked" parameter */
  293 
  294 /* SACK stuff */
  295 #define TCP_SACK_MAX 3
  296 #define TCPSACK_NONE 0
  297 #define TCPSACK_HAVED 1
  298         u_char rcv_sack_flags;          /* SACK flags. */
  299         struct sackblk rcv_dsack_block; /* RX D-SACK block. */
  300         struct ipqehead timeq;          /* time sequenced queue. */
  301         struct sackhead snd_holes;      /* TX SACK holes. */
  302         int     snd_numholes;           /* Number of TX SACK holes. */
  303         tcp_seq rcv_lastsack;           /* last seq number(+1) sack'd by rcv'r*/
  304         tcp_seq sack_newdata;           /* New data xmitted in this recovery
  305                                            episode starts at this seq number*/
  306         tcp_seq snd_fack;               /* FACK TCP.  Forward-most data held by
  307                                            peer. */
  308 
  309 /* pointer for syn cache entries*/
  310         LIST_HEAD(, syn_cache) t_sc;    /* list of entries by this tcb */
  311 
  312 /* prediction of next mbuf when using large window sizes */
  313         struct  mbuf *t_lastm;          /* last mbuf that data was sent from */
  314         int     t_inoff;                /* data offset in previous mbuf */
  315         int     t_lastoff;              /* last data address in mbuf chain */
  316         int     t_lastlen;              /* last length read from mbuf chain */
  317 
  318 /* Path-MTU discovery blackhole detection */
  319         int t_mtudisc;                  /* perform mtudisc for this tcb */
  320 /* Path-MTU Discovery Information */
  321         u_int   t_pmtud_mss_acked;      /* MSS acked, lower bound for MTU */
  322         u_int   t_pmtud_mtu_sent;       /* MTU used, upper bound for MTU */
  323         tcp_seq t_pmtud_th_seq;         /* TCP SEQ from ICMP payload */
  324         u_int   t_pmtud_nextmtu;        /* Advertised Next-Hop MTU from ICMP */
  325         u_short t_pmtud_ip_len;         /* IP length from ICMP payload */
  326         u_short t_pmtud_ip_hl;          /* IP header length from ICMP payload */
  327 
  328         uint8_t t_ecn_retries;          /* # of ECN setup retries */
  329         
  330         const struct tcp_congctl *t_congctl;    /* per TCB congctl algorithm */
  331 
  332         /* Keepalive per socket */
  333         u_int   t_keepinit;
  334         u_int   t_keepidle;
  335         u_int   t_keepintvl;
  336         u_int   t_keepcnt;
  337         u_int   t_maxidle;              /* t_keepcnt * t_keepintvl */
  338 
  339 };
  340 
  341 /*
  342  * Macros to aid ECN TCP.
  343  */
  344 #define TCP_ECN_ALLOWED(tp)     (tp->t_flags & TF_ECN_PERMIT)
  345 
  346 /*
  347  * Macros to aid SACK/FACK TCP.
  348  */
  349 #define TCP_SACK_ENABLED(tp)    (tp->t_flags & TF_WILL_SACK)
  350 #define TCP_FACK_FASTRECOV(tp)  \
  351         (TCP_SACK_ENABLED(tp) && \
  352         (SEQ_GT(tp->snd_fack, tp->snd_una + tcprexmtthresh * tp->t_segsz)))
  353 
  354 #ifdef _KERNEL
  355 /*
  356  * TCP reassembly queue locks.
  357  */
  358 static __inline int tcp_reass_lock_try (struct tcpcb *)
  359         __unused;
  360 static __inline void tcp_reass_unlock (struct tcpcb *)
  361         __unused;
  362 
  363 static __inline int
  364 tcp_reass_lock_try(struct tcpcb *tp)
  365 {
  366         int s;
  367 
  368         /*
  369          * Use splvm() -- we're blocking things that would cause
  370          * mbuf allocation.
  371          */
  372         s = splvm();
  373         if (tp->t_flags & TF_REASSEMBLING) {
  374                 splx(s);
  375                 return (0);
  376         }
  377         tp->t_flags |= TF_REASSEMBLING;
  378         splx(s);
  379         return (1);
  380 }
  381 
  382 static __inline void
  383 tcp_reass_unlock(struct tcpcb *tp)
  384 {
  385         int s;
  386 
  387         s = splvm();
  388         tp->t_flags &= ~TF_REASSEMBLING;
  389         splx(s);
  390 }
  391 
  392 #ifdef DIAGNOSTIC
  393 #define TCP_REASS_LOCK(tp)                                              \
  394 do {                                                                    \
  395         if (tcp_reass_lock_try(tp) == 0) {                              \
  396                 printf("%s:%d: tcpcb %p reass already locked\n",        \
  397                     __FILE__, __LINE__, tp);                            \
  398                 panic("tcp_reass_lock");                                \
  399         }                                                               \
  400 } while (/*CONSTCOND*/ 0)
  401 #define TCP_REASS_LOCK_CHECK(tp)                                        \
  402 do {                                                                    \
  403         if (((tp)->t_flags & TF_REASSEMBLING) == 0) {                   \
  404                 printf("%s:%d: tcpcb %p reass lock not held\n",         \
  405                     __FILE__, __LINE__, tp);                            \
  406                 panic("tcp reass lock check");                          \
  407         }                                                               \
  408 } while (/*CONSTCOND*/ 0)
  409 #else
  410 #define TCP_REASS_LOCK(tp)      (void) tcp_reass_lock_try((tp))
  411 #define TCP_REASS_LOCK_CHECK(tp) /* nothing */
  412 #endif
  413 
  414 #define TCP_REASS_UNLOCK(tp)    tcp_reass_unlock((tp))
  415 #endif /* _KERNEL */
  416 
  417 /*
  418  * Queue for delayed ACK processing.
  419  */
  420 #ifdef _KERNEL
  421 extern int tcp_delack_ticks;
  422 void    tcp_delack(void *);
  423 
  424 #define TCP_RESTART_DELACK(tp)                                          \
  425         callout_reset(&(tp)->t_delack_ch, tcp_delack_ticks,             \
  426             tcp_delack, tp)
  427 
  428 #define TCP_SET_DELACK(tp)                                              \
  429 do {                                                                    \
  430         if (((tp)->t_flags & TF_DELACK) == 0) {                         \
  431                 (tp)->t_flags |= TF_DELACK;                             \
  432                 TCP_RESTART_DELACK(tp);                                 \
  433         }                                                               \
  434 } while (/*CONSTCOND*/0)
  435 
  436 #define TCP_CLEAR_DELACK(tp)                                            \
  437 do {                                                                    \
  438         if ((tp)->t_flags & TF_DELACK) {                                \
  439                 (tp)->t_flags &= ~TF_DELACK;                            \
  440                 callout_stop(&(tp)->t_delack_ch);                       \
  441         }                                                               \
  442 } while (/*CONSTCOND*/0)
  443 #endif /* _KERNEL */
  444 
  445 /*
  446  * Compute the current timestamp for a connection.
  447  */
  448 #define TCP_TIMESTAMP(tp)       (tcp_now - (tp)->ts_timebase)
  449 
  450 /*
  451  * Handy way of passing around TCP option info.
  452  */
  453 struct tcp_opt_info {
  454         int             ts_present;
  455         u_int32_t       ts_val;
  456         u_int32_t       ts_ecr;
  457         u_int16_t       maxseg;
  458 };
  459 
  460 #define TOF_SIGNATURE   0x0040          /* signature option present */
  461 #define TOF_SIGLEN      0x0080          /* sigature length valid (RFC2385) */
  462 
  463 /*
  464  * Data for the TCP compressed state engine.
  465  */
  466 union syn_cache_sa {
  467         struct sockaddr sa;
  468         struct sockaddr_in sin;
  469 #if 1 /*def INET6*/
  470         struct sockaddr_in6 sin6;
  471 #endif
  472 };
  473 
  474 struct syn_cache {
  475         TAILQ_ENTRY(syn_cache) sc_bucketq;      /* link on bucket list */
  476         callout_t sc_timer;                     /* rexmt timer */
  477         struct route sc_route;
  478         long sc_win;                            /* advertised window */
  479         int sc_bucketidx;                       /* our bucket index */
  480         u_int32_t sc_hash;
  481         u_int32_t sc_timestamp;                 /* timestamp from SYN */
  482         u_int32_t sc_timebase;                  /* our local timebase */
  483         union syn_cache_sa sc_src;
  484         union syn_cache_sa sc_dst;
  485         tcp_seq sc_irs;
  486         tcp_seq sc_iss;
  487         u_int sc_rxtcur;                        /* current rxt timeout */
  488         u_int sc_rxttot;                        /* total time spend on queues */
  489         u_short sc_rxtshift;                    /* for computing backoff */
  490         u_short sc_flags;
  491 
  492 #define SCF_UNREACH             0x0001          /* we've had an unreach error */
  493 #define SCF_TIMESTAMP           0x0002          /* peer will do timestamps */
  494 #define SCF_DEAD                0x0004          /* this entry to be released */
  495 #define SCF_SACK_PERMIT         0x0008          /* peer will do SACK */
  496 #define SCF_ECN_PERMIT          0x0010          /* peer will do ECN */
  497 #define SCF_SIGNATURE   0x40                    /* send MD5 digests */
  498 
  499         struct mbuf *sc_ipopts;                 /* IP options */
  500         u_int16_t sc_peermaxseg;
  501         u_int16_t sc_ourmaxseg;
  502         u_int8_t sc_request_r_scale     : 4,
  503                  sc_requested_s_scale   : 4;
  504 
  505         struct tcpcb *sc_tp;                    /* tcb for listening socket */
  506         LIST_ENTRY(syn_cache) sc_tpq;           /* list of entries by same tp */
  507 };
  508 
  509 struct syn_cache_head {
  510         TAILQ_HEAD(, syn_cache) sch_bucket;     /* bucket entries */
  511         u_short sch_length;                     /* # entries in bucket */
  512 };
  513 
  514 #define intotcpcb(ip)   ((struct tcpcb *)(ip)->inp_ppcb)
  515 #ifdef INET6
  516 #define in6totcpcb(ip)  ((struct tcpcb *)(ip)->in6p_ppcb)
  517 #endif
  518 #ifndef INET6
  519 #define sototcpcb(so)   (intotcpcb(sotoinpcb(so)))
  520 #else
  521 #define sototcpcb(so)   (((so)->so_proto->pr_domain->dom_family == AF_INET) \
  522                                 ? intotcpcb(sotoinpcb(so)) \
  523                                 : in6totcpcb(sotoin6pcb(so)))
  524 #endif
  525 
  526 /*
  527  * The smoothed round-trip time and estimated variance
  528  * are stored as fixed point numbers scaled by the values below.
  529  * For convenience, these scales are also used in smoothing the average
  530  * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed).
  531  * With these scales, srtt has 3 bits to the right of the binary point,
  532  * and thus an "ALPHA" of 0.875.  rttvar has 2 bits to the right of the
  533  * binary point, and is smoothed with an ALPHA of 0.75.
  534  */
  535 #define TCP_RTT_SHIFT           3       /* shift for srtt; 3 bits frac. */
  536 #define TCP_RTTVAR_SHIFT        2       /* multiplier for rttvar; 2 bits */
  537 
  538 /*
  539  * The initial retransmission should happen at rtt + 4 * rttvar.
  540  * Because of the way we do the smoothing, srtt and rttvar
  541  * will each average +1/2 tick of bias.  When we compute
  542  * the retransmit timer, we want 1/2 tick of rounding and
  543  * 1 extra tick because of +-1/2 tick uncertainty in the
  544  * firing of the timer.  The bias will give us exactly the
  545  * 1.5 tick we need.  But, because the bias is
  546  * statistical, we have to test that we don't drop below
  547  * the minimum feasible timer (which is 2 ticks).
  548  * This macro assumes that the value of 1<<TCP_RTTVAR_SHIFT
  549  * is the same as the multiplier for rttvar.
  550  */
  551 #define TCP_REXMTVAL(tp) \
  552         ((((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) >> 2)
  553 
  554 /*
  555  * Compute the initial window for slow start.
  556  */
  557 #define TCP_INITIAL_WINDOW(iw, segsz) \
  558         (((iw) == 0) ? (min(4 * (segsz), max(2 * (segsz), 4380))) : \
  559          ((segsz) * (iw)))
  560 
  561 /*
  562  * TCP statistics.
  563  * Each counter is an unsigned 64-bit value.
  564  *
  565  * Many of these should be kept per connection, but that's inconvenient
  566  * at the moment.
  567  */
  568 #define TCP_STAT_CONNATTEMPT    0       /* connections initiated */
  569 #define TCP_STAT_ACCEPTS        1       /* connections accepted */
  570 #define TCP_STAT_CONNECTS       2       /* connections established */
  571 #define TCP_STAT_DROPS          3       /* connections dropped */
  572 #define TCP_STAT_CONNDROPS      4       /* embryonic connections dropped */
  573 #define TCP_STAT_CLOSED         5       /* conn. closed (includes drops) */
  574 #define TCP_STAT_SEGSTIMED      6       /* segs where we tried to get rtt */
  575 #define TCP_STAT_RTTUPDATED     7       /* times we succeeded */
  576 #define TCP_STAT_DELACK         8       /* delayed ACKs sent */
  577 #define TCP_STAT_TIMEOUTDROP    9       /* conn. dropped in rxmt timeout */
  578 #define TCP_STAT_REXMTTIMEO     10      /* retransmit timeouts */
  579 #define TCP_STAT_PERSISTTIMEO   11      /* persist timeouts */
  580 #define TCP_STAT_KEEPTIMEO      12      /* keepalive timeouts */
  581 #define TCP_STAT_KEEPPROBE      13      /* keepalive probes sent */
  582 #define TCP_STAT_KEEPDROPS      14      /* connections dropped in keepalive */
  583 #define TCP_STAT_PERSISTDROPS   15      /* connections dropped in persist */
  584 #define TCP_STAT_CONNSDRAINED   16      /* connections drained due to memory
  585                                            shortage */
  586 #define TCP_STAT_PMTUBLACKHOLE  17      /* PMTUD blackhole detected */
  587 #define TCP_STAT_SNDTOTAL       18      /* total packets sent */
  588 #define TCP_STAT_SNDPACK        19      /* data packlets sent */
  589 #define TCP_STAT_SNDBYTE        20      /* data bytes sent */
  590 #define TCP_STAT_SNDREXMITPACK  21      /* data packets retransmitted */
  591 #define TCP_STAT_SNDREXMITBYTE  22      /* data bytes retransmitted */
  592 #define TCP_STAT_SNDACKS        23      /* ACK-only packets sent */
  593 #define TCP_STAT_SNDPROBE       24      /* window probes sent */
  594 #define TCP_STAT_SNDURG         25      /* packets sent with URG only */
  595 #define TCP_STAT_SNDWINUP       26      /* window update-only packets sent */
  596 #define TCP_STAT_SNDCTRL        27      /* control (SYN|FIN|RST) packets sent */
  597 #define TCP_STAT_RCVTOTAL       28      /* total packets received */
  598 #define TCP_STAT_RCVPACK        29      /* packets received in sequence */
  599 #define TCP_STAT_RCVBYTE        30      /* bytes received in sequence */
  600 #define TCP_STAT_RCVBADSUM      31      /* packets received with cksum errs */
  601 #define TCP_STAT_RCVBADOFF      32      /* packets received with bad offset */
  602 #define TCP_STAT_RCVMEMDROP     33      /* packets dropped for lack of memory */
  603 #define TCP_STAT_RCVSHORT       34      /* packets received too short */
  604 #define TCP_STAT_RCVDUPPACK     35      /* duplicate-only packets received */
  605 #define TCP_STAT_RCVDUPBYTE     36      /* duplicate-only bytes received */
  606 #define TCP_STAT_RCVPARTDUPPACK 37      /* packets with some duplicate data */
  607 #define TCP_STAT_RCVPARTDUPBYTE 38      /* dup. bytes in part-dup. packets */
  608 #define TCP_STAT_RCVOOPACK      39      /* out-of-order packets received */
  609 #define TCP_STAT_RCVOOBYTE      40      /* out-of-order bytes received */
  610 #define TCP_STAT_RCVPACKAFTERWIN 41     /* packets with data after window */
  611 #define TCP_STAT_RCVBYTEAFTERWIN 42     /* bytes received after window */
  612 #define TCP_STAT_RCVAFTERCLOSE  43      /* packets received after "close" */
  613 #define TCP_STAT_RCVWINPROBE    44      /* rcvd window probe packets */
  614 #define TCP_STAT_RCVDUPACK      45      /* rcvd duplicate ACKs */
  615 #define TCP_STAT_RCVACKTOOMUCH  46      /* rcvd ACKs for unsent data */
  616 #define TCP_STAT_RCVACKPACK     47      /* rcvd ACK packets */
  617 #define TCP_STAT_RCVACKBYTE     48      /* bytes ACKed by rcvd ACKs */
  618 #define TCP_STAT_RCVWINUPD      49      /* rcvd window update packets */
  619 #define TCP_STAT_PAWSDROP       50      /* segments dropped due to PAWS */
  620 #define TCP_STAT_PREDACK        51      /* times hdr predict OK for ACKs */
  621 #define TCP_STAT_PREDDAT        52      /* times hdr predict OK for data pkts */
  622 #define TCP_STAT_PCBHASHMISS    53      /* input packets missing PCB hash */
  623 #define TCP_STAT_NOPORT         54      /* no socket on port */
  624 #define TCP_STAT_BADSYN         55      /* received ACK for which we have
  625                                            no SYN in compressed state */
  626 #define TCP_STAT_DELAYED_FREE   56      /* delayed pool_put() of tcpcb */
  627 #define TCP_STAT_SC_ADDED       57      /* # of sc entries added */
  628 #define TCP_STAT_SC_COMPLETED   58      /* # of sc connections completed */
  629 #define TCP_STAT_SC_TIMED_OUT   59      /* # of sc entries timed out */
  630 #define TCP_STAT_SC_OVERFLOWED  60      /* # of sc drops due to overflow */
  631 #define TCP_STAT_SC_RESET       61      /* # of sc drops due to RST */
  632 #define TCP_STAT_SC_UNREACH     62      /* # of sc drops due to ICMP unreach */
  633 #define TCP_STAT_SC_BUCKETOVERFLOW 63   /* # of sc drops due to bucket ovflow */
  634 #define TCP_STAT_SC_ABORTED     64      /* # of sc entries aborted (no mem) */
  635 #define TCP_STAT_SC_DUPESYN     65      /* # of duplicate SYNs received */
  636 #define TCP_STAT_SC_DROPPED     66      /* # of SYNs dropped (no route/mem) */
  637 #define TCP_STAT_SC_COLLISIONS  67      /* # of sc hash collisions */
  638 #define TCP_STAT_SC_RETRANSMITTED 68    /* # of sc retransmissions */
  639 #define TCP_STAT_SC_DELAYED_FREE 69     /* # of delayed pool_put()s */
  640 #define TCP_STAT_SELFQUENCH     70      /* # of ENOBUFS we get on output */
  641 #define TCP_STAT_BADSIG         71      /* # of drops due to bad signature */
  642 #define TCP_STAT_GOODSIG        72      /* # of packets with good signature */
  643 #define TCP_STAT_ECN_SHS        73      /* # of successful ECN handshakes */
  644 #define TCP_STAT_ECN_CE         74      /* # of packets with CE bit */
  645 #define TCP_STAT_ECN_ECT        75      /* # of packets with ECT(0) bit */
  646 
  647 #define TCP_NSTATS              76
  648 
  649 /*
  650  * Names for TCP sysctl objects.
  651  */
  652 #define TCPCTL_RFC1323          1       /* RFC1323 timestamps/scaling */
  653 #define TCPCTL_SENDSPACE        2       /* default send buffer */
  654 #define TCPCTL_RECVSPACE        3       /* default recv buffer */
  655 #define TCPCTL_MSSDFLT          4       /* default seg size */
  656 #define TCPCTL_SYN_CACHE_LIMIT  5       /* max size of comp. state engine */
  657 #define TCPCTL_SYN_BUCKET_LIMIT 6       /* max size of hash bucket */
  658 #if 0   /*obsoleted*/
  659 #define TCPCTL_SYN_CACHE_INTER  7       /* interval of comp. state timer */
  660 #endif
  661 #define TCPCTL_INIT_WIN         8       /* initial window */
  662 #define TCPCTL_MSS_IFMTU        9       /* mss from interface, not in_maxmtu */
  663 #define TCPCTL_SACK             10      /* RFC2018 selective acknowledgement */
  664 #define TCPCTL_WSCALE           11      /* RFC1323 window scaling */
  665 #define TCPCTL_TSTAMP           12      /* RFC1323 timestamps */
  666 #define TCPCTL_COMPAT_42        13      /* 4.2BSD TCP bug work-arounds */
  667 #define TCPCTL_CWM              14      /* Congestion Window Monitoring */
  668 #define TCPCTL_CWM_BURSTSIZE    15      /* burst size allowed by CWM */
  669 #define TCPCTL_ACK_ON_PUSH      16      /* ACK immediately on PUSH */
  670 #define TCPCTL_KEEPIDLE         17      /* keepalive idle time */
  671 #define TCPCTL_KEEPINTVL        18      /* keepalive probe interval */
  672 #define TCPCTL_KEEPCNT          19      /* keepalive count */
  673 #define TCPCTL_SLOWHZ           20      /* PR_SLOWHZ (read-only) */
  674 #define TCPCTL_NEWRENO          21      /* NewReno Congestion Control */
  675 #define TCPCTL_LOG_REFUSED      22      /* Log refused connections */
  676 #if 0   /*obsoleted*/
  677 #define TCPCTL_RSTRATELIMIT     23      /* RST rate limit */
  678 #endif
  679 #define TCPCTL_RSTPPSLIMIT      24      /* RST pps limit */
  680 #define TCPCTL_DELACK_TICKS     25      /* # ticks to delay ACK */
  681 #define TCPCTL_INIT_WIN_LOCAL   26      /* initial window for local nets */
  682 #define TCPCTL_IDENT            27      /* rfc 931 identd */
  683 #define TCPCTL_ACKDROPRATELIMIT 28      /* SYN/RST -> ACK rate limit */
  684 #define TCPCTL_LOOPBACKCKSUM    29      /* do TCP checksum on loopback */
  685 #define TCPCTL_STATS            30      /* TCP statistics */
  686 #define TCPCTL_DEBUG            31      /* TCP debug sockets */
  687 #define TCPCTL_DEBX             32      /* # of tcp debug sockets */
  688 #define TCPCTL_DROP             33      /* drop tcp connection */
  689 #define TCPCTL_MSL              34      /* Max Segment Life */
  690 #define TCPCTL_MAXID            35
  691 
  692 #define TCPCTL_NAMES { \
  693         { 0, 0 }, \
  694         { "rfc1323",    CTLTYPE_INT }, \
  695         { "sendspace",  CTLTYPE_INT }, \
  696         { "recvspace",  CTLTYPE_INT }, \
  697         { "mssdflt",    CTLTYPE_INT }, \
  698         { "syn_cache_limit", CTLTYPE_INT }, \
  699         { "syn_bucket_limit", CTLTYPE_INT }, \
  700         { 0, 0 },\
  701         { "init_win", CTLTYPE_INT }, \
  702         { "mss_ifmtu", CTLTYPE_INT }, \
  703         { "sack", CTLTYPE_INT }, \
  704         { "win_scale", CTLTYPE_INT }, \
  705         { "timestamps", CTLTYPE_INT }, \
  706         { "compat_42", CTLTYPE_INT }, \
  707         { "cwm", CTLTYPE_INT }, \
  708         { "cwm_burstsize", CTLTYPE_INT }, \
  709         { "ack_on_push", CTLTYPE_INT }, \
  710         { "keepidle",   CTLTYPE_INT }, \
  711         { "keepintvl",  CTLTYPE_INT }, \
  712         { "keepcnt",    CTLTYPE_INT }, \
  713         { "slowhz",     CTLTYPE_INT }, \
  714         { 0, 0 }, \
  715         { "log_refused",CTLTYPE_INT }, \
  716         { 0, 0 }, \
  717         { "rstppslimit", CTLTYPE_INT }, \
  718         { "delack_ticks", CTLTYPE_INT }, \
  719         { "init_win_local", CTLTYPE_INT }, \
  720         { "ident", CTLTYPE_STRUCT }, \
  721         { "ackdropppslimit", CTLTYPE_INT }, \
  722         { "do_loopback_cksum", CTLTYPE_INT }, \
  723         { "stats", CTLTYPE_STRUCT }, \
  724         { "debug", CTLTYPE_STRUCT }, \
  725         { "debx", CTLTYPE_INT }, \
  726         { "drop", CTLTYPE_STRUCT }, \
  727         { "msl", CTLTYPE_INT }, \
  728 }
  729 
  730 #ifdef _KERNEL
  731 extern  struct inpcbtable tcbtable;     /* head of queue of active tcpcb's */
  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_mss_ifmtu;      /* take MSS from interface, not in_maxmtu */
  743 extern  int tcp_compat_42;      /* work around ancient broken TCP peers */
  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_syn_cache_limit; /* max entries for compressed state engine */
  748 extern  int tcp_syn_bucket_limit;/* max entries per hash bucket */
  749 extern  int tcp_log_refused;    /* log refused connections */
  750 extern  int tcp_do_ecn;         /* TCP ECN enabled/disabled? */
  751 extern  int tcp_ecn_maxretries; /* Max ECN setup retries */
  752 #if NRND > 0
  753 extern  int tcp_do_rfc1948;     /* ISS by cryptographic hash */
  754 #endif
  755 extern int tcp_sack_tp_maxholes;        /* Max holes per connection. */
  756 extern int tcp_sack_globalmaxholes;     /* Max holes per system. */
  757 extern int tcp_sack_globalholes;        /* Number of holes present. */
  758 extern int tcp_do_abc;                  /* RFC3465 ABC enabled/disabled? */
  759 extern int tcp_abc_aggressive;          /* 1: L=2*SMSS  0: L=1*SMSS */
  760 
  761 extern  int tcp_rst_ppslim;
  762 extern  int tcp_ackdrop_ppslim;
  763 
  764 extern  int tcp_syn_cache_size;
  765 extern  struct syn_cache_head tcp_syn_cache[];
  766 extern  u_long syn_cache_count;
  767 
  768 #ifdef MBUFTRACE
  769 extern  struct mowner tcp_rx_mowner;
  770 extern  struct mowner tcp_tx_mowner;
  771 extern  struct mowner tcp_reass_mowner;
  772 extern  struct mowner tcp_sock_mowner;
  773 extern  struct mowner tcp_sock_rx_mowner;
  774 extern  struct mowner tcp_sock_tx_mowner;
  775 extern  struct mowner tcp_mowner;
  776 #endif
  777 
  778 extern int tcp_do_autorcvbuf;
  779 extern int tcp_autorcvbuf_inc;
  780 extern int tcp_autorcvbuf_max;
  781 extern int tcp_do_autosndbuf;
  782 extern int tcp_autosndbuf_inc;
  783 extern int tcp_autosndbuf_max;
  784 
  785 
  786 #define TCPCTL_VARIABLES { \
  787         { 0 },                                  \
  788         { 1, 0, &tcp_do_rfc1323 },              \
  789         { 1, 0, &tcp_sendspace },               \
  790         { 1, 0, &tcp_recvspace },               \
  791         { 1, 0, &tcp_mssdflt },                 \
  792         { 1, 0, &tcp_syn_cache_limit },         \
  793         { 1, 0, &tcp_syn_bucket_limit },        \
  794         { 0 },                                  \
  795         { 1, 0, &tcp_init_win },                \
  796         { 1, 0, &tcp_mss_ifmtu },               \
  797         { 1, 0, &tcp_do_sack },                 \
  798         { 1, 0, &tcp_do_win_scale },            \
  799         { 1, 0, &tcp_do_timestamps },           \
  800         { 1, 0, &tcp_compat_42 },               \
  801         { 1, 0, &tcp_cwm },                     \
  802         { 1, 0, &tcp_cwm_burstsize },           \
  803         { 1, 0, &tcp_ack_on_push },             \
  804         { 1, 0, &tcp_keepidle },                \
  805         { 1, 0, &tcp_keepintvl },               \
  806         { 1, 0, &tcp_keepcnt },                 \
  807         { 1, 1, 0, PR_SLOWHZ },                 \
  808         { 0 },                                  \
  809         { 1, 0, &tcp_log_refused },             \
  810         { 0 },                                  \
  811         { 1, 0, &tcp_rst_ppslim },              \
  812         { 1, 0, &tcp_delack_ticks },            \
  813         { 1, 0, &tcp_init_win_local },          \
  814         { 1, 0, &tcp_ackdrop_ppslim },          \
  815 }
  816 
  817 struct secasvar;
  818 
  819 int      tcp_attach(struct socket *);
  820 void     tcp_canceltimers(struct tcpcb *);
  821 struct tcpcb *
  822          tcp_close(struct tcpcb *);
  823 int      tcp_isdead(struct tcpcb *);
  824 #ifdef INET6
  825 void     *tcp6_ctlinput(int, const struct sockaddr *, void *);
  826 #endif
  827 void     *tcp_ctlinput(int, const struct sockaddr *, void *);
  828 int      tcp_ctloutput(int, struct socket *, struct sockopt *);
  829 struct tcpcb *
  830          tcp_disconnect(struct tcpcb *);
  831 struct tcpcb *
  832          tcp_drop(struct tcpcb *, int);
  833 #ifdef TCP_SIGNATURE
  834 int      tcp_signature_apply(void *, void *, u_int);
  835 struct secasvar *tcp_signature_getsav(struct mbuf *, struct tcphdr *);
  836 int      tcp_signature(struct mbuf *, struct tcphdr *, int, struct secasvar *,
  837             char *);
  838 #endif
  839 void     tcp_drain(void);
  840 void     tcp_established(struct tcpcb *);
  841 void     tcp_init(void);
  842 #ifdef INET6
  843 int      tcp6_input(struct mbuf **, int *, int);
  844 #endif
  845 void     tcp_input(struct mbuf *, ...);
  846 u_int    tcp_hdrsz(struct tcpcb *);
  847 u_long   tcp_mss_to_advertise(const struct ifnet *, int);
  848 void     tcp_mss_from_peer(struct tcpcb *, int);
  849 void     tcp_tcpcb_template(void);
  850 struct tcpcb *
  851          tcp_newtcpcb(int, void *);
  852 void     tcp_notify(struct inpcb *, int);
  853 #ifdef INET6
  854 void     tcp6_notify(struct in6pcb *, int);
  855 #endif
  856 u_int    tcp_optlen(struct tcpcb *);
  857 int      tcp_output(struct tcpcb *);
  858 void     tcp_pulloutofband(struct socket *,
  859             struct tcphdr *, struct mbuf *, int);
  860 void     tcp_quench(struct inpcb *, int);
  861 #ifdef INET6
  862 void     tcp6_quench(struct in6pcb *, int);
  863 #endif
  864 void     tcp_mtudisc(struct inpcb *, int);
  865 
  866 struct ipqent *tcpipqent_alloc(void);
  867 void     tcpipqent_free(struct ipqent *);
  868 
  869 int      tcp_respond(struct tcpcb *, struct mbuf *, struct mbuf *,
  870             struct tcphdr *, tcp_seq, tcp_seq, int);
  871 void     tcp_rmx_rtt(struct tcpcb *);
  872 void     tcp_setpersist(struct tcpcb *);
  873 #ifdef TCP_SIGNATURE
  874 int      tcp_signature_compute(struct mbuf *, struct tcphdr *, int, int,
  875             int, u_char *, u_int);
  876 #endif
  877 void     tcp_slowtimo(void);
  878 struct mbuf *
  879          tcp_template(struct tcpcb *);
  880 void     tcp_trace(short, short, struct tcpcb *, struct mbuf *, int);
  881 struct tcpcb *
  882          tcp_usrclosed(struct tcpcb *);
  883 int      tcp_usrreq(struct socket *,
  884             int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *);
  885 void     tcp_xmit_timer(struct tcpcb *, uint32_t);
  886 tcp_seq  tcp_new_iss(struct tcpcb *, tcp_seq);
  887 tcp_seq  tcp_new_iss1(void *, void *, u_int16_t, u_int16_t, size_t,
  888             tcp_seq);
  889 
  890 void     tcp_new_dsack(struct tcpcb *, tcp_seq, u_int32_t);
  891 void     tcp_sack_option(struct tcpcb *, const struct tcphdr *,
  892             const u_char *, int);
  893 void     tcp_del_sackholes(struct tcpcb *, const struct tcphdr *);
  894 void     tcp_free_sackholes(struct tcpcb *);
  895 void     tcp_sack_adjust(struct tcpcb *tp);
  896 struct sackhole *tcp_sack_output(struct tcpcb *tp, int *sack_bytes_rexmt);
  897 void     tcp_sack_newack(struct tcpcb *, const struct tcphdr *);
  898 int      tcp_sack_numblks(const struct tcpcb *);
  899 #define TCP_SACK_OPTLEN(nblks)  ((nblks) * 8 + 2 + 2)
  900 
  901 void     tcp_statinc(u_int);
  902 void     tcp_statadd(u_int, uint64_t);
  903 
  904 int      syn_cache_add(struct sockaddr *, struct sockaddr *,
  905                 struct tcphdr *, unsigned int, struct socket *,
  906                 struct mbuf *, u_char *, int, struct tcp_opt_info *);
  907 void     syn_cache_unreach(const struct sockaddr *, const struct sockaddr *,
  908            struct tcphdr *);
  909 struct socket *syn_cache_get(struct sockaddr *, struct sockaddr *,
  910                 struct tcphdr *, unsigned int, unsigned int,
  911                 struct socket *so, struct mbuf *);
  912 void     syn_cache_init(void);
  913 void     syn_cache_insert(struct syn_cache *, struct tcpcb *);
  914 struct syn_cache *syn_cache_lookup(const struct sockaddr *, const struct sockaddr *,
  915                 struct syn_cache_head **);
  916 void     syn_cache_reset(struct sockaddr *, struct sockaddr *,
  917                 struct tcphdr *);
  918 int      syn_cache_respond(struct syn_cache *, struct mbuf *);
  919 void     syn_cache_timer(void *);
  920 void     syn_cache_cleanup(struct tcpcb *);
  921 
  922 int      tcp_input_checksum(int, struct mbuf *, const struct tcphdr *, int, int,
  923     int);
  924 #endif
  925 
  926 #endif /* !_NETINET_TCP_VAR_H_ */

Cache object: 8ea62fdc46185780e2b50d107641682f


[ 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.