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.106.2.2 2004/09/18 19:35:55 he 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 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  *
   80  * Redistribution and use in source and binary forms, with or without
   81  * modification, are permitted provided that the following conditions
   82  * are met:
   83  * 1. Redistributions of source code must retain the above copyright
   84  *    notice, this list of conditions and the following disclaimer.
   85  * 2. Redistributions in binary form must reproduce the above copyright
   86  *    notice, this list of conditions and the following disclaimer in the
   87  *    documentation and/or other materials provided with the distribution.
   88  * 3. All advertising materials mentioning features or use of this software
   89  *    must display the following acknowledgement:
   90  *      This product includes software developed by the NetBSD
   91  *      Foundation, Inc. and its contributors.
   92  * 4. Neither the name of The NetBSD Foundation nor the names of its
   93  *    contributors may be used to endorse or promote products derived
   94  *    from this software without specific prior written permission.
   95  *
   96  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   97  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   98  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   99  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
  100  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  101  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  102  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  103  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  104  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  105  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  106  * POSSIBILITY OF SUCH DAMAGE.
  107  */
  108 
  109 /*
  110  * Copyright (c) 1982, 1986, 1993, 1994, 1995
  111  *      The Regents of the University of California.  All rights reserved.
  112  *
  113  * Redistribution and use in source and binary forms, with or without
  114  * modification, are permitted provided that the following conditions
  115  * are met:
  116  * 1. Redistributions of source code must retain the above copyright
  117  *    notice, this list of conditions and the following disclaimer.
  118  * 2. Redistributions in binary form must reproduce the above copyright
  119  *    notice, this list of conditions and the following disclaimer in the
  120  *    documentation and/or other materials provided with the distribution.
  121  * 3. Neither the name of the University nor the names of its contributors
  122  *    may be used to endorse or promote products derived from this software
  123  *    without specific prior written permission.
  124  *
  125  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  126  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  127  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  128  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  129  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  130  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  131  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  132  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  133  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  134  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  135  * SUCH DAMAGE.
  136  *
  137  *      @(#)tcp_var.h   8.4 (Berkeley) 5/24/95
  138  */
  139 
  140 #ifndef _NETINET_TCP_VAR_H_
  141 #define _NETINET_TCP_VAR_H_
  142 
  143 #if defined(_KERNEL_OPT)
  144 #include "opt_inet.h"
  145 #include "opt_mbuftrace.h"
  146 #endif
  147 
  148 /*
  149  * Kernel variables for tcp.
  150  */
  151 
  152 #include <sys/callout.h>
  153 
  154 /*
  155  * Tcp control block, one per tcp; fields:
  156  */
  157 struct tcpcb {
  158         int     t_family;               /* address family on the wire */
  159         struct ipqehead segq;           /* sequencing queue */
  160         struct callout t_timer[TCPT_NTIMERS];/* tcp timers */
  161         short   t_state;                /* state of this connection */
  162         short   t_rxtshift;             /* log(2) of rexmt exp. backoff */
  163         uint32_t t_rxtcur;              /* current retransmit value */
  164         short   t_dupacks;              /* consecutive dup acks recd */
  165         u_short t_peermss;              /* peer's maximum segment size */
  166         u_short t_ourmss;               /* our's maximum segment size */
  167         u_short t_segsz;                /* current segment size in use */
  168         char    t_force;                /* 1 if forcing out a byte */
  169         u_int   t_flags;
  170 #define TF_ACKNOW       0x0001          /* ack peer immediately */
  171 #define TF_DELACK       0x0002          /* ack, but try to delay it */
  172 #define TF_NODELAY      0x0004          /* don't delay packets to coalesce */
  173 #define TF_NOOPT        0x0008          /* don't use tcp options */
  174 #define TF_REQ_SCALE    0x0020          /* have/will request window scaling */
  175 #define TF_RCVD_SCALE   0x0040          /* other side has requested scaling */
  176 #define TF_REQ_TSTMP    0x0080          /* have/will request timestamps */
  177 #define TF_RCVD_TSTMP   0x0100          /* a timestamp was received in SYN */
  178 #define TF_SACK_PERMIT  0x0200          /* other side said I could SACK */
  179 #define TF_SYN_REXMT    0x0400          /* rexmit timer fired on SYN */
  180 #define TF_WILL_SACK    0x0800          /* try to use SACK */
  181 #define TF_CANT_TXSACK  0x1000          /* other side said I could not SACK */
  182 #define TF_IGNR_RXSACK  0x2000          /* ignore received SACK blocks */
  183 #define TF_REASSEMBLING 0x4000          /* we're busy reassembling */
  184 #define TF_DEAD         0x8000          /* dead and to-be-released */
  185 
  186 
  187         struct  mbuf *t_template;       /* skeletal packet for transmit */
  188         struct  inpcb *t_inpcb;         /* back pointer to internet pcb */
  189         struct  in6pcb *t_in6pcb;       /* back pointer to internet pcb */
  190         struct  callout t_delack_ch;    /* delayed ACK callout */
  191 /*
  192  * The following fields are used as in the protocol specification.
  193  * See RFC783, Dec. 1981, page 21.
  194  */
  195 /* send sequence variables */
  196         tcp_seq snd_una;                /* send unacknowledged */
  197         tcp_seq snd_nxt;                /* send next */
  198         tcp_seq snd_up;                 /* send urgent pointer */
  199         tcp_seq snd_wl1;                /* window update seg seq number */
  200         tcp_seq snd_wl2;                /* window update seg ack number */
  201         tcp_seq iss;                    /* initial send sequence number */
  202         u_long  snd_wnd;                /* send window */
  203         tcp_seq snd_recover;            /* for use in fast recovery */
  204 /* receive sequence variables */
  205         u_long  rcv_wnd;                /* receive window */
  206         tcp_seq rcv_nxt;                /* receive next */
  207         tcp_seq rcv_up;                 /* receive urgent pointer */
  208         tcp_seq irs;                    /* initial receive sequence number */
  209 /*
  210  * Additional variables for this implementation.
  211  */
  212 /* receive variables */
  213         tcp_seq rcv_adv;                /* advertised window */
  214 /* retransmit variables */
  215         tcp_seq snd_max;                /* highest sequence number sent;
  216                                          * used to recognize retransmits
  217                                          */
  218 /* congestion control (for slow start, source quench, retransmit after loss) */
  219         u_long  snd_cwnd;               /* congestion-controlled window */
  220         u_long  snd_ssthresh;           /* snd_cwnd size threshhold for
  221                                          * for slow start exponential to
  222                                          * linear switch
  223                                          */
  224 /*
  225  * transmit timing stuff.  See below for scale of srtt and rttvar.
  226  * "Variance" is actually smoothed difference.
  227  */
  228         uint32_t t_rcvtime;             /* time last segment received */
  229         uint32_t t_rtttime;             /* time we started measuring rtt */
  230         tcp_seq t_rtseq;                /* sequence number being timed */
  231         int32_t t_srtt;                 /* smoothed round-trip time */
  232         int32_t t_rttvar;               /* variance in round-trip time */
  233         uint32_t t_rttmin;              /* minimum rtt allowed */
  234         u_long  max_sndwnd;             /* largest window peer has offered */
  235 
  236 /* out-of-band data */
  237         char    t_oobflags;             /* have some */
  238         char    t_iobc;                 /* input character */
  239 #define TCPOOB_HAVEDATA 0x01
  240 #define TCPOOB_HADDATA  0x02
  241         short   t_softerror;            /* possible error not yet reported */
  242 
  243 /* RFC 1323 variables */
  244         u_char  snd_scale;              /* window scaling for send window */
  245         u_char  rcv_scale;              /* window scaling for recv window */
  246         u_char  request_r_scale;        /* pending window scaling */
  247         u_char  requested_s_scale;
  248         u_int32_t ts_recent;            /* timestamp echo data */
  249         u_int32_t ts_recent_age;        /* when last updated */
  250         u_int32_t ts_timebase;          /* our timebase */
  251         tcp_seq last_ack_sent;
  252 
  253 /* SACK stuff */
  254         struct ipqehead timeq;          /* time sequenced queue (for SACK) */
  255 
  256 /* path MTU discovery blackhole detection */
  257         int t_mtudisc;                  /* perform mtudisc for this tcb */
  258 
  259 /* pointer for syn cache entries*/
  260         LIST_HEAD(, syn_cache) t_sc;    /* list of entries by this tcb */
  261 
  262 /* prediction of next mbuf when using large window sizes */
  263         struct  mbuf *t_lastm;          /* last mbuf that data was sent from */
  264         int     t_inoff;                /* data offset in previous mbuf */
  265         int     t_lastoff;              /* last data address in mbuf chain */
  266         int     t_lastlen;              /* last length read from mbuf chain */
  267 };
  268 
  269 #ifdef _KERNEL
  270 /*
  271  * TCP reassembly queue locks.
  272  */
  273 static __inline int tcp_reass_lock_try __P((struct tcpcb *))
  274         __attribute__((__unused__));
  275 static __inline void tcp_reass_unlock __P((struct tcpcb *))
  276         __attribute__((__unused__));
  277 
  278 static __inline int
  279 tcp_reass_lock_try(tp)
  280         struct tcpcb *tp;
  281 {
  282         int s;
  283 
  284         /*
  285          * Use splvm() -- we're blocking things that would cause
  286          * mbuf allocation.
  287          */
  288         s = splvm();
  289         if (tp->t_flags & TF_REASSEMBLING) {
  290                 splx(s);
  291                 return (0);
  292         }
  293         tp->t_flags |= TF_REASSEMBLING;
  294         splx(s);
  295         return (1);
  296 }
  297 
  298 static __inline void
  299 tcp_reass_unlock(tp)
  300         struct tcpcb *tp;
  301 {
  302         int s;
  303 
  304         s = splvm();
  305         tp->t_flags &= ~TF_REASSEMBLING;
  306         splx(s);
  307 }
  308 
  309 #ifdef DIAGNOSTIC
  310 #define TCP_REASS_LOCK(tp)                                              \
  311 do {                                                                    \
  312         if (tcp_reass_lock_try(tp) == 0) {                              \
  313                 printf("%s:%d: tcpcb %p reass already locked\n",        \
  314                     __FILE__, __LINE__, tp);                            \
  315                 panic("tcp_reass_lock");                                \
  316         }                                                               \
  317 } while (/*CONSTCOND*/ 0)
  318 #define TCP_REASS_LOCK_CHECK(tp)                                        \
  319 do {                                                                    \
  320         if (((tp)->t_flags & TF_REASSEMBLING) == 0) {                   \
  321                 printf("%s:%d: tcpcb %p reass lock not held\n",         \
  322                     __FILE__, __LINE__, tp);                            \
  323                 panic("tcp reass lock check");                          \
  324         }                                                               \
  325 } while (/*CONSTCOND*/ 0)
  326 #else
  327 #define TCP_REASS_LOCK(tp)      (void) tcp_reass_lock_try((tp))
  328 #define TCP_REASS_LOCK_CHECK(tp) /* nothing */
  329 #endif
  330 
  331 #define TCP_REASS_UNLOCK(tp)    tcp_reass_unlock((tp))
  332 #endif /* _KERNEL */
  333 
  334 /*
  335  * Queue for delayed ACK processing.
  336  */
  337 #ifdef _KERNEL
  338 extern int tcp_delack_ticks;
  339 void    tcp_delack(void *);
  340 
  341 #define TCP_RESTART_DELACK(tp)                                          \
  342         callout_reset(&(tp)->t_delack_ch, tcp_delack_ticks,             \
  343             tcp_delack, tp)
  344 
  345 #define TCP_SET_DELACK(tp)                                              \
  346 do {                                                                    \
  347         if (((tp)->t_flags & TF_DELACK) == 0) {                         \
  348                 (tp)->t_flags |= TF_DELACK;                             \
  349                 TCP_RESTART_DELACK(tp);                                 \
  350         }                                                               \
  351 } while (/*CONSTCOND*/0)
  352 
  353 #define TCP_CLEAR_DELACK(tp)                                            \
  354 do {                                                                    \
  355         if ((tp)->t_flags & TF_DELACK) {                                \
  356                 (tp)->t_flags &= ~TF_DELACK;                            \
  357                 callout_stop(&(tp)->t_delack_ch);                       \
  358         }                                                               \
  359 } while (/*CONSTCOND*/0)
  360 #endif /* _KERNEL */
  361 
  362 /*
  363  * Compute the current timestamp for a connection.
  364  */
  365 #define TCP_TIMESTAMP(tp)       (tcp_now - (tp)->ts_timebase)
  366 
  367 /*
  368  * Handy way of passing around TCP option info.
  369  */
  370 struct tcp_opt_info {
  371         int             ts_present;
  372         u_int32_t       ts_val;
  373         u_int32_t       ts_ecr;
  374         u_int16_t       maxseg;
  375 };
  376 
  377 /*
  378  * Data for the TCP compressed state engine.
  379  */
  380 union syn_cache_sa {
  381         struct sockaddr sa;
  382         struct sockaddr_in sin;
  383 #if 1 /*def INET6*/
  384         struct sockaddr_in6 sin6;
  385 #endif
  386 };
  387 
  388 struct syn_cache {
  389         TAILQ_ENTRY(syn_cache) sc_bucketq;      /* link on bucket list */
  390         struct callout sc_timer;                /* rexmt timer */
  391         union {                                 /* cached route */
  392                 struct route route4;
  393 #ifdef INET6
  394                 struct route_in6 route6;
  395 #endif
  396         } sc_route_u;
  397 #define sc_route4       sc_route_u.route4
  398 #ifdef INET6
  399 #define sc_route6       sc_route_u.route6
  400 #endif
  401         long sc_win;                            /* advertised window */
  402         int sc_bucketidx;                       /* our bucket index */
  403         u_int32_t sc_hash;
  404         u_int32_t sc_timestamp;                 /* timestamp from SYN */
  405         u_int32_t sc_timebase;                  /* our local timebase */
  406         union syn_cache_sa sc_src;
  407         union syn_cache_sa sc_dst;
  408         tcp_seq sc_irs;
  409         tcp_seq sc_iss;
  410         u_int sc_rxtcur;                        /* current rxt timeout */
  411         u_int sc_rxttot;                        /* total time spend on queues */
  412         u_short sc_rxtshift;                    /* for computing backoff */
  413         u_short sc_flags;
  414 
  415 #define SCF_UNREACH             0x0001          /* we've had an unreach error */
  416 #define SCF_TIMESTAMP           0x0002          /* peer will do timestamps */
  417 #define SCF_DEAD                0x0004          /* this entry to be released */
  418 
  419         struct mbuf *sc_ipopts;                 /* IP options */
  420         u_int16_t sc_peermaxseg;
  421         u_int16_t sc_ourmaxseg;
  422         u_int8_t sc_request_r_scale     : 4,
  423                  sc_requested_s_scale   : 4;
  424 
  425         struct tcpcb *sc_tp;                    /* tcb for listening socket */
  426         LIST_ENTRY(syn_cache) sc_tpq;           /* list of entries by same tp */
  427 };
  428 
  429 struct syn_cache_head {
  430         TAILQ_HEAD(, syn_cache) sch_bucket;     /* bucket entries */
  431         u_short sch_length;                     /* # entries in bucket */
  432 };
  433 
  434 #define intotcpcb(ip)   ((struct tcpcb *)(ip)->inp_ppcb)
  435 #ifdef INET6
  436 #define in6totcpcb(ip)  ((struct tcpcb *)(ip)->in6p_ppcb)
  437 #endif
  438 #ifndef INET6
  439 #define sototcpcb(so)   (intotcpcb(sotoinpcb(so)))
  440 #else
  441 #define sototcpcb(so)   (((so)->so_proto->pr_domain->dom_family == AF_INET) \
  442                                 ? intotcpcb(sotoinpcb(so)) \
  443                                 : in6totcpcb(sotoin6pcb(so)))
  444 #endif
  445 
  446 /*
  447  * The smoothed round-trip time and estimated variance
  448  * are stored as fixed point numbers scaled by the values below.
  449  * For convenience, these scales are also used in smoothing the average
  450  * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed).
  451  * With these scales, srtt has 3 bits to the right of the binary point,
  452  * and thus an "ALPHA" of 0.875.  rttvar has 2 bits to the right of the
  453  * binary point, and is smoothed with an ALPHA of 0.75.
  454  */
  455 #define TCP_RTT_SHIFT           3       /* shift for srtt; 3 bits frac. */
  456 #define TCP_RTTVAR_SHIFT        2       /* multiplier for rttvar; 2 bits */
  457 
  458 /*
  459  * The initial retransmission should happen at rtt + 4 * rttvar.
  460  * Because of the way we do the smoothing, srtt and rttvar
  461  * will each average +1/2 tick of bias.  When we compute
  462  * the retransmit timer, we want 1/2 tick of rounding and
  463  * 1 extra tick because of +-1/2 tick uncertainty in the
  464  * firing of the timer.  The bias will give us exactly the
  465  * 1.5 tick we need.  But, because the bias is
  466  * statistical, we have to test that we don't drop below
  467  * the minimum feasible timer (which is 2 ticks).
  468  * This macro assumes that the value of 1<<TCP_RTTVAR_SHIFT
  469  * is the same as the multiplier for rttvar.
  470  */
  471 #define TCP_REXMTVAL(tp) \
  472         ((((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) >> 2)
  473 
  474 /*
  475  * Compute the initial window for slow start.
  476  */
  477 #define TCP_INITIAL_WINDOW(iw, segsz) \
  478         (((iw) == 0) ? (min(4 * (segsz), max(2 * (segsz), 4380))) : \
  479          ((segsz) * (iw)))
  480 
  481 /*
  482  * TCP statistics.
  483  * Many of these should be kept per connection,
  484  * but that's inconvenient at the moment.
  485  */
  486 struct  tcpstat {
  487         u_quad_t tcps_connattempt;      /* connections initiated */
  488         u_quad_t tcps_accepts;          /* connections accepted */
  489         u_quad_t tcps_connects;         /* connections established */
  490         u_quad_t tcps_drops;            /* connections dropped */
  491         u_quad_t tcps_conndrops;        /* embryonic connections dropped */
  492         u_quad_t tcps_closed;           /* conn. closed (includes drops) */
  493         u_quad_t tcps_segstimed;        /* segs where we tried to get rtt */
  494         u_quad_t tcps_rttupdated;       /* times we succeeded */
  495         u_quad_t tcps_delack;           /* delayed acks sent */
  496         u_quad_t tcps_timeoutdrop;      /* conn. dropped in rxmt timeout */
  497         u_quad_t tcps_rexmttimeo;       /* retransmit timeouts */
  498         u_quad_t tcps_persisttimeo;     /* persist timeouts */
  499         u_quad_t tcps_keeptimeo;        /* keepalive timeouts */
  500         u_quad_t tcps_keepprobe;        /* keepalive probes sent */
  501         u_quad_t tcps_keepdrops;        /* connections dropped in keepalive */
  502         u_quad_t tcps_persistdrops;     /* connections dropped in persist */
  503         u_quad_t tcps_connsdrained;     /* connections drained due to memory
  504                                            shortage */
  505         u_quad_t tcps_pmtublackhole;    /* PMTUD blackhole detected */
  506 
  507         u_quad_t tcps_sndtotal;         /* total packets sent */
  508         u_quad_t tcps_sndpack;          /* data packets sent */
  509         u_quad_t tcps_sndbyte;          /* data bytes sent */
  510         u_quad_t tcps_sndrexmitpack;    /* data packets retransmitted */
  511         u_quad_t tcps_sndrexmitbyte;    /* data bytes retransmitted */
  512         u_quad_t tcps_sndacks;          /* ack-only packets sent */
  513         u_quad_t tcps_sndprobe;         /* window probes sent */
  514         u_quad_t tcps_sndurg;           /* packets sent with URG only */
  515         u_quad_t tcps_sndwinup;         /* window update-only packets sent */
  516         u_quad_t tcps_sndctrl;          /* control (SYN|FIN|RST) packets sent */
  517 
  518         u_quad_t tcps_rcvtotal;         /* total packets received */
  519         u_quad_t tcps_rcvpack;          /* packets received in sequence */
  520         u_quad_t tcps_rcvbyte;          /* bytes received in sequence */
  521         u_quad_t tcps_rcvbadsum;        /* packets received with ccksum errs */
  522         u_quad_t tcps_rcvbadoff;        /* packets received with bad offset */
  523         u_quad_t tcps_rcvmemdrop;       /* packets dropped for lack of memory */
  524         u_quad_t tcps_rcvshort;         /* packets received too short */
  525         u_quad_t tcps_rcvduppack;       /* duplicate-only packets received */
  526         u_quad_t tcps_rcvdupbyte;       /* duplicate-only bytes received */
  527         u_quad_t tcps_rcvpartduppack;   /* packets with some duplicate data */
  528         u_quad_t tcps_rcvpartdupbyte;   /* dup. bytes in part-dup. packets */
  529         u_quad_t tcps_rcvoopack;        /* out-of-order packets received */
  530         u_quad_t tcps_rcvoobyte;        /* out-of-order bytes received */
  531         u_quad_t tcps_rcvpackafterwin;  /* packets with data after window */
  532         u_quad_t tcps_rcvbyteafterwin;  /* bytes rcvd after window */
  533         u_quad_t tcps_rcvafterclose;    /* packets rcvd after "close" */
  534         u_quad_t tcps_rcvwinprobe;      /* rcvd window probe packets */
  535         u_quad_t tcps_rcvdupack;        /* rcvd duplicate acks */
  536         u_quad_t tcps_rcvacktoomuch;    /* rcvd acks for unsent data */
  537         u_quad_t tcps_rcvackpack;       /* rcvd ack packets */
  538         u_quad_t tcps_rcvackbyte;       /* bytes acked by rcvd acks */
  539         u_quad_t tcps_rcvwinupd;        /* rcvd window update packets */
  540         u_quad_t tcps_pawsdrop;         /* segments dropped due to PAWS */
  541         u_quad_t tcps_predack;          /* times hdr predict ok for acks */
  542         u_quad_t tcps_preddat;          /* times hdr predict ok for data pkts */
  543 
  544         u_quad_t tcps_pcbhashmiss;      /* input packets missing pcb hash */
  545         u_quad_t tcps_noport;           /* no socket on port */
  546         u_quad_t tcps_badsyn;           /* received ack for which we have
  547                                            no SYN in compressed state */
  548         u_quad_t tcps_delayed_free;     /* delayed pool_put() of tcpcb */
  549 
  550         /* These statistics deal with the SYN cache. */
  551         u_quad_t tcps_sc_added;         /* # of entries added */
  552         u_quad_t tcps_sc_completed;     /* # of connections completed */
  553         u_quad_t tcps_sc_timed_out;     /* # of entries timed out */
  554         u_quad_t tcps_sc_overflowed;    /* # dropped due to overflow */
  555         u_quad_t tcps_sc_reset;         /* # dropped due to RST */
  556         u_quad_t tcps_sc_unreach;       /* # dropped due to ICMP unreach */
  557         u_quad_t tcps_sc_bucketoverflow;/* # dropped due to bucket overflow */
  558         u_quad_t tcps_sc_aborted;       /* # of entries aborted (no mem) */
  559         u_quad_t tcps_sc_dupesyn;       /* # of duplicate SYNs received */
  560         u_quad_t tcps_sc_dropped;       /* # of SYNs dropped (no route/mem) */
  561         u_quad_t tcps_sc_collisions;    /* # of hash collisions */
  562         u_quad_t tcps_sc_retransmitted; /* # of retransmissions */
  563         u_quad_t tcps_sc_delayed_free;  /* # of delayed pool_put()s */
  564 
  565         u_quad_t tcps_selfquench;       /* # of ENOBUFS we get on output */
  566 };
  567 
  568 /*
  569  * Names for TCP sysctl objects.
  570  */
  571 #define TCPCTL_RFC1323          1       /* RFC1323 timestamps/scaling */
  572 #define TCPCTL_SENDSPACE        2       /* default send buffer */
  573 #define TCPCTL_RECVSPACE        3       /* default recv buffer */
  574 #define TCPCTL_MSSDFLT          4       /* default seg size */
  575 #define TCPCTL_SYN_CACHE_LIMIT  5       /* max size of comp. state engine */
  576 #define TCPCTL_SYN_BUCKET_LIMIT 6       /* max size of hash bucket */
  577 #if 0   /*obsoleted*/
  578 #define TCPCTL_SYN_CACHE_INTER  7       /* interval of comp. state timer */
  579 #endif
  580 #define TCPCTL_INIT_WIN         8       /* initial window */
  581 #define TCPCTL_MSS_IFMTU        9       /* mss from interface, not in_maxmtu */
  582 #define TCPCTL_SACK             10      /* RFC2018 selective acknowledgement */
  583 #define TCPCTL_WSCALE           11      /* RFC1323 window scaling */
  584 #define TCPCTL_TSTAMP           12      /* RFC1323 timestamps */
  585 #define TCPCTL_COMPAT_42        13      /* 4.2BSD TCP bug work-arounds */
  586 #define TCPCTL_CWM              14      /* Congestion Window Monitoring */
  587 #define TCPCTL_CWM_BURSTSIZE    15      /* burst size allowed by CWM */
  588 #define TCPCTL_ACK_ON_PUSH      16      /* ACK immediately on PUSH */
  589 #define TCPCTL_KEEPIDLE         17      /* keepalive idle time */
  590 #define TCPCTL_KEEPINTVL        18      /* keepalive probe interval */
  591 #define TCPCTL_KEEPCNT          19      /* keepalive count */
  592 #define TCPCTL_SLOWHZ           20      /* PR_SLOWHZ (read-only) */
  593 #define TCPCTL_NEWRENO          21      /* NewReno Congestion Control */
  594 #define TCPCTL_LOG_REFUSED      22      /* Log refused connections */
  595 #if 0   /*obsoleted*/
  596 #define TCPCTL_RSTRATELIMIT     23      /* RST rate limit */
  597 #endif
  598 #define TCPCTL_RSTPPSLIMIT      24      /* RST pps limit */
  599 #define TCPCTL_DELACK_TICKS     25      /* # ticks to delay ACK */
  600 #define TCPCTL_INIT_WIN_LOCAL   26      /* initial window for local nets */
  601 #define TCPCTL_IDENT            27      /* rfc 931 identd */
  602 #define TCPCTL_ACKDROPRATELIMIT 28      /* SYN/RST -> ACK rate limit */
  603 #define TCPCTL_MAXID            29
  604 
  605 #define TCPCTL_NAMES { \
  606         { 0, 0 }, \
  607         { "rfc1323",    CTLTYPE_INT }, \
  608         { "sendspace",  CTLTYPE_INT }, \
  609         { "recvspace",  CTLTYPE_INT }, \
  610         { "mssdflt",    CTLTYPE_INT }, \
  611         { "syn_cache_limit", CTLTYPE_INT }, \
  612         { "syn_bucket_limit", CTLTYPE_INT }, \
  613         { 0, 0 },\
  614         { "init_win", CTLTYPE_INT }, \
  615         { "mss_ifmtu", CTLTYPE_INT }, \
  616         { "sack", CTLTYPE_INT }, \
  617         { "win_scale", CTLTYPE_INT }, \
  618         { "timestamps", CTLTYPE_INT }, \
  619         { "compat_42", CTLTYPE_INT }, \
  620         { "cwm", CTLTYPE_INT }, \
  621         { "cwm_burstsize", CTLTYPE_INT }, \
  622         { "ack_on_push", CTLTYPE_INT }, \
  623         { "keepidle",   CTLTYPE_INT }, \
  624         { "keepintvl",  CTLTYPE_INT }, \
  625         { "keepcnt",    CTLTYPE_INT }, \
  626         { "slowhz",     CTLTYPE_INT }, \
  627         { "newreno",    CTLTYPE_INT }, \
  628         { "log_refused",CTLTYPE_INT }, \
  629         { 0, 0 }, \
  630         { "rstppslimit", CTLTYPE_INT }, \
  631         { "delack_ticks", CTLTYPE_INT }, \
  632         { "init_win_local", CTLTYPE_INT }, \
  633         { "ident", CTLTYPE_STRUCT }, \
  634         { "ackdropppslimit", CTLTYPE_INT }, \
  635 }
  636 
  637 #ifdef _KERNEL
  638 extern  struct inpcbtable tcbtable;     /* head of queue of active tcpcb's */
  639 extern  struct tcpstat tcpstat; /* tcp statistics */
  640 extern  u_int32_t tcp_now;      /* for RFC 1323 timestamps */
  641 extern  int tcp_do_rfc1323;     /* enabled/disabled? */
  642 extern  int tcp_do_sack;        /* SACK enabled/disabled? */
  643 extern  int tcp_do_win_scale;   /* RFC1323 window scaling enabled/disabled? */
  644 extern  int tcp_do_timestamps;  /* RFC1323 timestamps enabled/disabled? */
  645 extern  int tcp_do_newreno;     /* Use the New Reno algorithms */
  646 extern  int tcp_mssdflt;        /* default seg size */
  647 extern  int tcp_init_win;       /* initial window */
  648 extern  int tcp_init_win_local; /* initial window for local nets */
  649 extern  int tcp_mss_ifmtu;      /* take MSS from interface, not in_maxmtu */
  650 extern  int tcp_compat_42;      /* work around ancient broken TCP peers */
  651 extern  int tcp_cwm;            /* enable Congestion Window Monitoring */
  652 extern  int tcp_cwm_burstsize;  /* burst size allowed by CWM */
  653 extern  int tcp_ack_on_push;    /* ACK immediately on PUSH */
  654 extern  int tcp_syn_cache_limit; /* max entries for compressed state engine */
  655 extern  int tcp_syn_bucket_limit;/* max entries per hash bucket */
  656 extern  int tcp_log_refused;    /* log refused connections */
  657 
  658 extern  int tcp_rst_ppslim;
  659 extern  int tcp_ackdrop_ppslim;
  660 
  661 extern  int tcp_syn_cache_size;
  662 extern  struct syn_cache_head tcp_syn_cache[];
  663 extern  u_long syn_cache_count;
  664 
  665 extern  struct pool tcpipqent_pool;
  666 
  667 #ifdef MBUFTRACE
  668 extern  struct mowner tcp_rx_mowner;
  669 extern  struct mowner tcp_tx_mowner;
  670 extern  struct mowner tcp_mowner;
  671 #endif
  672 
  673 #define TCPCTL_VARIABLES { \
  674         { 0 },                                  \
  675         { 1, 0, &tcp_do_rfc1323 },              \
  676         { 1, 0, &tcp_sendspace },               \
  677         { 1, 0, &tcp_recvspace },               \
  678         { 1, 0, &tcp_mssdflt },                 \
  679         { 1, 0, &tcp_syn_cache_limit },         \
  680         { 1, 0, &tcp_syn_bucket_limit },        \
  681         { 0 },                                  \
  682         { 1, 0, &tcp_init_win },                \
  683         { 1, 0, &tcp_mss_ifmtu },               \
  684         { 1, 0, &tcp_do_sack },                 \
  685         { 1, 0, &tcp_do_win_scale },            \
  686         { 1, 0, &tcp_do_timestamps },           \
  687         { 1, 0, &tcp_compat_42 },               \
  688         { 1, 0, &tcp_cwm },                     \
  689         { 1, 0, &tcp_cwm_burstsize },           \
  690         { 1, 0, &tcp_ack_on_push },             \
  691         { 1, 0, &tcp_keepidle },                \
  692         { 1, 0, &tcp_keepintvl },               \
  693         { 1, 0, &tcp_keepcnt },                 \
  694         { 1, 1, 0, PR_SLOWHZ },                 \
  695         { 1, 0, &tcp_do_newreno },              \
  696         { 1, 0, &tcp_log_refused },             \
  697         { 0 },                                  \
  698         { 1, 0, &tcp_rst_ppslim },              \
  699         { 1, 0, &tcp_delack_ticks },            \
  700         { 1, 0, &tcp_init_win_local },          \
  701         { 1, 0, &tcp_ackdrop_ppslim },          \
  702 }
  703 
  704 #ifdef __NO_STRICT_ALIGNMENT
  705 #define TCP_HDR_ALIGNED_P(th)   1
  706 #else
  707 #define TCP_HDR_ALIGNED_P(th)   ((((vaddr_t) (th)) & 3) == 0)
  708 #endif
  709 
  710 int      tcp_attach __P((struct socket *));
  711 void     tcp_canceltimers __P((struct tcpcb *));
  712 int      tcp_timers_invoking __P((struct tcpcb*));
  713 struct tcpcb *
  714          tcp_close __P((struct tcpcb *));
  715 int      tcp_isdead __P((struct tcpcb *));
  716 #ifdef INET6
  717 void     tcp6_ctlinput __P((int, struct sockaddr *, void *));
  718 #endif
  719 void     *tcp_ctlinput __P((int, struct sockaddr *, void *));
  720 int      tcp_ctloutput __P((int, struct socket *, int, int, struct mbuf **));
  721 struct tcpcb *
  722          tcp_disconnect __P((struct tcpcb *));
  723 struct tcpcb *
  724          tcp_drop __P((struct tcpcb *, int));
  725 void     tcp_dooptions __P((struct tcpcb *,
  726             u_char *, int, struct tcphdr *, struct tcp_opt_info *));
  727 void     tcp_drain __P((void));
  728 void     tcp_established __P((struct tcpcb *));
  729 void     tcp_init __P((void));
  730 #ifdef INET6
  731 int      tcp6_input __P((struct mbuf **, int *, int));
  732 #endif
  733 void     tcp_input __P((struct mbuf *, ...));
  734 u_long   tcp_mss_to_advertise __P((const struct ifnet *, int));
  735 void     tcp_mss_from_peer __P((struct tcpcb *, int));
  736 void     tcp_tcpcb_template __P((void));
  737 struct tcpcb *
  738          tcp_newtcpcb __P((int, void *));
  739 void     tcp_notify __P((struct inpcb *, int));
  740 #ifdef INET6
  741 void     tcp6_notify __P((struct in6pcb *, int));
  742 #endif
  743 u_int    tcp_optlen __P((struct tcpcb *));
  744 int      tcp_output __P((struct tcpcb *));
  745 void     tcp_pulloutofband __P((struct socket *,
  746             struct tcphdr *, struct mbuf *, int));
  747 void     tcp_quench __P((struct inpcb *, int));
  748 #ifdef INET6
  749 void     tcp6_quench __P((struct in6pcb *, int));
  750 #endif
  751 int      tcp_reass __P((struct tcpcb *, struct tcphdr *, struct mbuf *, int *));
  752 int      tcp_respond __P((struct tcpcb *, struct mbuf *, struct mbuf *,
  753             struct tcphdr *, tcp_seq, tcp_seq, int));
  754 void     tcp_rmx_rtt __P((struct tcpcb *));
  755 void     tcp_setpersist __P((struct tcpcb *));
  756 void     tcp_slowtimo __P((void));
  757 struct mbuf *
  758          tcp_template __P((struct tcpcb *));
  759 void     tcp_trace __P((int, int, struct tcpcb *, struct mbuf *, int));
  760 struct tcpcb *
  761          tcp_usrclosed __P((struct tcpcb *));
  762 int      tcp_sysctl __P((int *, u_int, void *, size_t *, void *, size_t));
  763 int      tcp_usrreq __P((struct socket *,
  764             int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *));
  765 void     tcp_xmit_timer __P((struct tcpcb *, uint32_t));
  766 tcp_seq  tcp_new_iss __P((struct tcpcb *, tcp_seq));
  767 tcp_seq  tcp_new_iss1 __P((void *, void *, u_int16_t, u_int16_t, size_t,
  768             tcp_seq));
  769 
  770 int      syn_cache_add __P((struct sockaddr *, struct sockaddr *,
  771                 struct tcphdr *, unsigned int, struct socket *,
  772                 struct mbuf *, u_char *, int, struct tcp_opt_info *));
  773 void     syn_cache_unreach __P((struct sockaddr *, struct sockaddr *,
  774            struct tcphdr *));
  775 struct socket *syn_cache_get __P((struct sockaddr *, struct sockaddr *,
  776                 struct tcphdr *, unsigned int, unsigned int,
  777                 struct socket *so, struct mbuf *));
  778 void     syn_cache_init __P((void));
  779 void     syn_cache_insert __P((struct syn_cache *, struct tcpcb *));
  780 struct syn_cache *syn_cache_lookup __P((struct sockaddr *, struct sockaddr *,
  781                 struct syn_cache_head **));
  782 void     syn_cache_reset __P((struct sockaddr *, struct sockaddr *,
  783                 struct tcphdr *));
  784 int      syn_cache_respond __P((struct syn_cache *, struct mbuf *));
  785 void     syn_cache_timer __P((void *));
  786 void     syn_cache_cleanup __P((struct tcpcb *));
  787 
  788 int     tcp_newreno __P((struct tcpcb *, struct tcphdr *));
  789 #endif
  790 
  791 #endif /* _NETINET_TCP_VAR_H_ */

Cache object: 795d0acf7f6ba979a88db31648551c9f


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