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 /*      $OpenBSD: tcp_var.h,v 1.162 2022/12/13 18:10:55 claudio Exp $   */
    2 /*      $NetBSD: tcp_var.h,v 1.17 1996/02/13 23:44:24 christos Exp $    */
    3 
    4 /*
    5  * Copyright (c) 1982, 1986, 1993, 1994
    6  *      The Regents of the University of California.  All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  * 3. Neither the name of the University nor the names of its contributors
   17  *    may be used to endorse or promote products derived from this software
   18  *    without specific prior written permission.
   19  *
   20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   30  * SUCH DAMAGE.
   31  *
   32  *      @(#)tcp_var.h   8.3 (Berkeley) 4/10/94
   33  */
   34 
   35 #ifndef _NETINET_TCP_VAR_H_
   36 #define _NETINET_TCP_VAR_H_
   37 
   38 #include <sys/timeout.h>
   39 
   40 /*
   41  * Kernel variables for tcp.
   42  */
   43 
   44 struct sackblk {
   45         tcp_seq start;          /* start seq no. of sack block */
   46         tcp_seq end;            /* end seq no. */
   47 };
   48 
   49 struct sackhole {
   50         tcp_seq start;          /* start seq no. of hole */
   51         tcp_seq end;            /* end seq no. */
   52         int     dups;           /* number of dup(s)acks for this hole */
   53         tcp_seq rxmit;          /* next seq. no in hole to be retransmitted */
   54         struct sackhole *next;  /* next in list */
   55 };
   56 
   57 /*
   58  * TCP sequence queue structures.
   59  */
   60 TAILQ_HEAD(tcpqehead, tcpqent);
   61 struct tcpqent {
   62         TAILQ_ENTRY(tcpqent) tcpqe_q;
   63         struct tcphdr   *tcpqe_tcp;
   64         struct mbuf     *tcpqe_m;       /* mbuf contains packet */
   65 };
   66 
   67 /*
   68  * Tcp control block, one per tcp; fields:
   69  */
   70 struct tcpcb {
   71         struct tcpqehead t_segq;                /* sequencing queue */
   72         struct timeout t_timer[TCPT_NTIMERS];   /* tcp timers */
   73         short   t_state;                /* state of this connection */
   74         short   t_rxtshift;             /* log(2) of rexmt exp. backoff */
   75         int     t_rxtcur;               /* current retransmit value */
   76         short   t_dupacks;              /* consecutive dup acks recd */
   77         u_short t_maxseg;               /* maximum segment size */
   78         char    t_force;                /* 1 if forcing out a byte */
   79         u_int   t_flags;
   80 #define TF_ACKNOW       0x0001U         /* ack peer immediately */
   81 #define TF_NODELAY      0x0004U         /* don't delay packets to coalesce */
   82 #define TF_NOOPT        0x0008U         /* don't use tcp options */
   83 #define TF_SENTFIN      0x0010U         /* have sent FIN */
   84 #define TF_REQ_SCALE    0x0020U         /* have/will request window scaling */
   85 #define TF_RCVD_SCALE   0x0040U         /* other side has requested scaling */
   86 #define TF_REQ_TSTMP    0x0080U         /* have/will request timestamps */
   87 #define TF_RCVD_TSTMP   0x0100U         /* a timestamp was received in SYN */
   88 #define TF_SACK_PERMIT  0x0200U         /* other side said I could SACK */
   89 #define TF_SIGNATURE    0x0400U         /* require TCP MD5 signature */
   90 #ifdef TCP_ECN
   91 #define TF_ECN_PERMIT   0x00008000U     /* other side said I could ECN */
   92 #define TF_RCVD_CE      0x00010000U     /* send ECE in subsequent segs */
   93 #define TF_SEND_CWR     0x00020000U     /* send CWR in next seg */
   94 #define TF_DISABLE_ECN  0x00040000U     /* disable ECN for this connection */
   95 #endif
   96 #define TF_LASTIDLE     0x00100000U     /* no outstanding ACK on last send */
   97 #define TF_PMTUD_PEND   0x00400000U     /* Path MTU Discovery pending */
   98 #define TF_NEEDOUTPUT   0x00800000U     /* call tcp_output after tcp_input */
   99 #define TF_BLOCKOUTPUT  0x01000000U     /* avert tcp_output during tcp_input */
  100 #define TF_NOPUSH       0x02000000U     /* don't push */
  101 #define TF_TMR_REXMT    0x04000000U     /* retransmit timer armed */
  102 #define TF_TMR_PERSIST  0x08000000U     /* retransmit persistence timer armed */
  103 #define TF_TMR_KEEP     0x10000000U     /* keep alive timer armed */
  104 #define TF_TMR_2MSL     0x20000000U     /* 2*msl quiet time timer armed */
  105 #define TF_TMR_REAPER   0x40000000U     /* delayed cleanup timer armed, dead */
  106 #define TF_TMR_DELACK   0x80000000U     /* delayed ack timer armed */
  107 #define TF_TIMER        TF_TMR_REXMT    /* used to shift with TCPT values */
  108 
  109         struct  mbuf *t_template;       /* skeletal packet for transmit */
  110         struct  inpcb *t_inpcb;         /* back pointer to internet pcb */
  111 /*
  112  * The following fields are used as in the protocol specification.
  113  * See RFC793, Dec. 1981, page 21.
  114  */
  115 /* send sequence variables */
  116         tcp_seq snd_una;                /* send unacknowledged */
  117         tcp_seq snd_nxt;                /* send next */
  118         tcp_seq snd_up;                 /* send urgent pointer */
  119         tcp_seq snd_wl1;                /* window update seg seq number */
  120         tcp_seq snd_wl2;                /* window update seg ack number */
  121         tcp_seq iss;                    /* initial send sequence number */
  122         u_long  snd_wnd;                /* send window */
  123         int     sack_enable;            /* enable SACK for this connection */
  124         int     snd_numholes;           /* number of holes seen by sender */
  125         struct sackhole *snd_holes;     /* linked list of holes (sorted) */
  126         tcp_seq snd_last;               /* for use in fast recovery */
  127 /* receive sequence variables */
  128         u_long  rcv_wnd;                /* receive window */
  129         tcp_seq rcv_nxt;                /* receive next */
  130         tcp_seq rcv_up;                 /* receive urgent pointer */
  131         tcp_seq irs;                    /* initial receive sequence number */
  132         tcp_seq rcv_lastsack;           /* last seq number(+1) sack'd by rcv'r*/
  133         int     rcv_numsacks;           /* # distinct sack blks present */
  134         struct sackblk sackblks[MAX_SACK_BLKS]; /* seq nos. of sack blocks */
  135 
  136 /*
  137  * Additional variables for this implementation.
  138  */
  139 /* receive variables */
  140         tcp_seq rcv_adv;                /* advertised window */
  141 /* retransmit variables */
  142         tcp_seq snd_max;                /* highest sequence number sent;
  143                                          * used to recognize retransmits
  144                                          */
  145 /* congestion control (for slow start, source quench, retransmit after loss) */
  146         u_long  snd_cwnd;               /* congestion-controlled window */
  147         u_long  snd_ssthresh;           /* snd_cwnd size threshold for
  148                                          * for slow start exponential to
  149                                          * linear switch
  150                                          */
  151 
  152 /* auto-sizing variables */
  153         u_int   rfbuf_cnt;      /* recv buffer autoscaling byte count */
  154         u_int32_t rfbuf_ts;     /* recv buffer autoscaling time stamp */
  155 
  156         u_short t_maxopd;               /* mss plus options */
  157         u_short t_peermss;              /* peer's maximum segment size */
  158 
  159 /*
  160  * transmit timing stuff.  See below for scale of srtt and rttvar.
  161  * "Variance" is actually smoothed difference.
  162  */
  163         uint32_t t_rcvtime;             /* time last segment received */
  164         uint32_t t_rcvacktime;          /* time last ack received */
  165         uint32_t t_sndtime;             /* time last segment sent */
  166         uint32_t t_sndacktime;          /* time last ack sent */
  167         uint32_t t_rtttime;             /* time we started measuring rtt */
  168         tcp_seq t_rtseq;                /* sequence number being timed */
  169         int     t_srtt;                 /* smoothed round-trip time */
  170         int     t_rttvar;               /* variance in round-trip time */
  171         u_int   t_rttmin;               /* minimum rtt allowed */
  172         u_long  max_sndwnd;             /* largest window peer has offered */
  173 
  174 /* out-of-band data */
  175         char    t_oobflags;             /* have some */
  176         char    t_iobc;                 /* input character */
  177 #define TCPOOB_HAVEDATA 0x01
  178 #define TCPOOB_HADDATA  0x02
  179         short   t_softerror;            /* possible error not yet reported */
  180 
  181 /* RFC 1323 variables */
  182         u_char  snd_scale;              /* window scaling for send window */
  183         u_char  rcv_scale;              /* window scaling for recv window */
  184         u_char  request_r_scale;        /* pending window scaling */
  185         u_char  requested_s_scale;
  186         u_int32_t ts_recent;            /* timestamp echo data */
  187         u_int32_t ts_modulate;          /* modulation on timestamp */
  188         u_int32_t ts_recent_age;        /* when last updated */
  189         tcp_seq last_ack_sent;
  190 
  191 /* pointer for syn cache entries*/
  192         LIST_HEAD(, syn_cache) t_sc;    /* list of entries by this tcb */
  193 
  194 /* Path-MTU Discovery Information */
  195         u_int   t_pmtud_mss_acked;      /* MSS acked, lower bound for MTU */
  196         u_int   t_pmtud_mtu_sent;       /* MTU used, upper bound for MTU */
  197         tcp_seq t_pmtud_th_seq;         /* TCP SEQ from ICMP payload */
  198         u_int   t_pmtud_nextmtu;        /* Advertised Next-Hop MTU from ICMP */
  199         u_short t_pmtud_ip_len;         /* IP length from ICMP payload */
  200         u_short t_pmtud_ip_hl;          /* IP header length from ICMP payload */
  201 
  202         int pf;
  203 
  204 /* maintain a few stats per connection: */
  205         u_int   t_rcvoopack;            /* out-of-order packets received */
  206         u_int   t_sndrexmitpack;        /* retransmit packets sent */
  207         u_int   t_sndzerowin;           /* zero-window updates sent */
  208 };
  209 
  210 #define intotcpcb(ip)   ((struct tcpcb *)(ip)->inp_ppcb)
  211 #define sototcpcb(so)   (intotcpcb(sotoinpcb(so)))
  212 
  213 #ifdef _KERNEL
  214 /*
  215  * Handy way of passing around TCP option info.
  216  */
  217 struct tcp_opt_info {
  218         int             ts_present;
  219         u_int32_t       ts_val;
  220         u_int32_t       ts_ecr;
  221         u_int16_t       maxseg;
  222 };
  223 
  224 /*
  225  * Data for the TCP compressed state engine.
  226  */
  227 
  228 #define TCP_SYN_HASH_SIZE       293
  229 #define TCP_SYN_BUCKET_SIZE     35
  230 
  231 union syn_cache_sa {
  232         struct sockaddr sa;
  233         struct sockaddr_in sin;
  234         struct sockaddr_in6 sin6;
  235 };
  236 
  237 struct syn_cache {
  238         TAILQ_ENTRY(syn_cache) sc_bucketq;      /* link on bucket list */
  239         struct timeout sc_timer;                /* rexmt timer */
  240         union {                                 /* cached route */
  241                 struct route route4;
  242 #ifdef INET6
  243                 struct route_in6 route6;
  244 #endif
  245         } sc_route_u;
  246 #define sc_route4       sc_route_u.route4
  247 #ifdef INET6
  248 #define sc_route6       sc_route_u.route6
  249 #endif
  250         long sc_win;                            /* advertised window */
  251         struct syn_cache_head *sc_buckethead;   /* our bucket index */
  252         struct syn_cache_set *sc_set;           /* our syn cache set */
  253         u_int32_t sc_hash;
  254         u_int32_t sc_timestamp;                 /* timestamp from SYN */
  255         u_int32_t sc_modulate;                  /* our timestamp modulator */
  256 #if 0
  257         u_int32_t sc_timebase;                  /* our local timebase */
  258 #endif
  259         union syn_cache_sa sc_src;
  260         union syn_cache_sa sc_dst;
  261         tcp_seq sc_irs;
  262         tcp_seq sc_iss;
  263         u_int sc_rtableid;
  264         u_int sc_rxtcur;                        /* current rxt timeout */
  265         u_int sc_rxttot;                        /* total time spend on queues */
  266         u_short sc_rxtshift;                    /* for computing backoff */
  267         u_short sc_flags;
  268 
  269 #define SCF_UNREACH             0x0001          /* we've had an unreach error */
  270 #define SCF_TIMESTAMP           0x0002          /* peer will do timestamps */
  271 #define SCF_DEAD                0x0004          /* this entry to be released */
  272 #define SCF_SACK_PERMIT         0x0008          /* permit sack */
  273 #define SCF_ECN_PERMIT          0x0010          /* permit ecn */
  274 #define SCF_SIGNATURE           0x0020          /* enforce tcp signatures */
  275 
  276         struct mbuf *sc_ipopts;                 /* IP options */
  277         u_int16_t sc_peermaxseg;
  278         u_int16_t sc_ourmaxseg;
  279         u_int     sc_request_r_scale    : 4,
  280                   sc_requested_s_scale  : 4;
  281 
  282         struct tcpcb *sc_tp;                    /* tcb for listening socket */
  283         LIST_ENTRY(syn_cache) sc_tpq;           /* list of entries by same tp */
  284 };
  285 
  286 struct syn_cache_head {
  287         TAILQ_HEAD(, syn_cache) sch_bucket;     /* bucket entries */
  288         u_short sch_length;                     /* # entries in bucket */
  289 };
  290 
  291 struct syn_cache_set {
  292         struct          syn_cache_head *scs_buckethead;
  293         int             scs_size;
  294         int             scs_count;
  295         int             scs_use;
  296         u_int32_t       scs_random[5];
  297 };
  298 
  299 #endif /* _KERNEL */
  300 
  301 /*
  302  * The smoothed round-trip time and estimated variance
  303  * are stored as fixed point numbers scaled by the values below.
  304  * For convenience, these scales are also used in smoothing the average
  305  * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed).
  306  * With these scales, srtt has 5 bits to the right of the binary point,
  307  * and thus an "ALPHA" of 0.875.  rttvar has 4 bits to the right of the
  308  * binary point, and is smoothed with an ALPHA of 0.75.
  309  */
  310 #define TCP_RTT_SHIFT           3       /* shift for srtt; 5 bits frac. */
  311 #define TCP_RTTVAR_SHIFT        2       /* shift for rttvar; 4 bits */
  312 #define TCP_RTT_BASE_SHIFT      2       /* remaining 2 bit shift */
  313 #define TCP_RTT_MAX             (1<<18) /* maximum rtt */
  314 
  315 /*
  316  * The initial retransmission should happen at rtt + 4 * rttvar.
  317  * Because of the way we do the smoothing, srtt and rttvar
  318  * will each average +1/2 tick of bias.  When we compute
  319  * the retransmit timer, we want 1/2 tick of rounding and
  320  * 1 extra tick because of +-1/2 tick uncertainty in the
  321  * firing of the timer.  The bias will give us exactly the
  322  * 1.5 tick we need.  But, because the bias is
  323  * statistical, we have to test that we don't drop below
  324  * the minimum feasible timer (which is 2 ticks).
  325  * This macro assumes that the value of (1 << TCP_RTTVAR_SHIFT)
  326  * is the same as the multiplier for rttvar.
  327  */
  328 #define TCP_REXMTVAL(tp) \
  329         ((((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) >> TCP_RTT_BASE_SHIFT)
  330 
  331 /*
  332  * TCP statistics.
  333  * Many of these should be kept per connection,
  334  * but that's inconvenient at the moment.
  335  */
  336 struct  tcpstat {
  337         u_int32_t tcps_connattempt;     /* connections initiated */
  338         u_int32_t tcps_accepts;         /* connections accepted */
  339         u_int32_t tcps_connects;        /* connections established */
  340         u_int32_t tcps_drops;           /* connections dropped */
  341         u_int32_t tcps_conndrops;       /* embryonic connections dropped */
  342         u_int32_t tcps_closed;          /* conn. closed (includes drops) */
  343         u_int32_t tcps_segstimed;       /* segs where we tried to get rtt */
  344         u_int32_t tcps_rttupdated;      /* times we succeeded */
  345         u_int32_t tcps_delack;          /* delayed acks sent */
  346         u_int32_t tcps_timeoutdrop;     /* conn. dropped in rxmt timeout */
  347         u_int32_t tcps_rexmttimeo;      /* retransmit timeouts */
  348         u_int32_t tcps_persisttimeo;    /* persist timeouts */
  349         u_int32_t tcps_persistdrop;     /* connections dropped in persist */
  350         u_int32_t tcps_keeptimeo;       /* keepalive timeouts */
  351         u_int32_t tcps_keepprobe;       /* keepalive probes sent */
  352         u_int32_t tcps_keepdrops;       /* connections dropped in keepalive */
  353 
  354         u_int32_t tcps_sndtotal;                /* total packets sent */
  355         u_int32_t tcps_sndpack;         /* data packets sent */
  356         u_int64_t tcps_sndbyte;         /* data bytes sent */
  357         u_int32_t tcps_sndrexmitpack;   /* data packets retransmitted */
  358         u_int64_t tcps_sndrexmitbyte;   /* data bytes retransmitted */
  359         u_int64_t tcps_sndrexmitfast;   /* Fast retransmits */
  360         u_int32_t tcps_sndacks;         /* ack-only packets sent */
  361         u_int32_t tcps_sndprobe;        /* window probes sent */
  362         u_int32_t tcps_sndurg;          /* packets sent with URG only */
  363         u_int32_t tcps_sndwinup;        /* window update-only packets sent */
  364         u_int32_t tcps_sndctrl;         /* control (SYN|FIN|RST) packets sent */
  365 
  366         u_int32_t tcps_rcvtotal;        /* total packets received */
  367         u_int32_t tcps_rcvpack;         /* packets received in sequence */
  368         u_int64_t tcps_rcvbyte;         /* bytes received in sequence */
  369         u_int32_t tcps_rcvbadsum;       /* packets received with ccksum errs */
  370         u_int32_t tcps_rcvbadoff;       /* packets received with bad offset */
  371         u_int32_t tcps_rcvmemdrop;      /* packets dropped for lack of memory */
  372         u_int32_t tcps_rcvnosec;        /* packets dropped for lack of ipsec */
  373         u_int32_t tcps_rcvshort;        /* packets received too short */
  374         u_int32_t tcps_rcvduppack;      /* duplicate-only packets received */
  375         u_int64_t tcps_rcvdupbyte;      /* duplicate-only bytes received */
  376         u_int32_t tcps_rcvpartduppack;  /* packets with some duplicate data */
  377         u_int64_t tcps_rcvpartdupbyte;  /* dup. bytes in part-dup. packets */
  378         u_int32_t tcps_rcvoopack;       /* out-of-order packets received */
  379         u_int64_t tcps_rcvoobyte;       /* out-of-order bytes received */
  380         u_int32_t tcps_rcvpackafterwin; /* packets with data after window */
  381         u_int64_t tcps_rcvbyteafterwin; /* bytes rcvd after window */
  382         u_int32_t tcps_rcvafterclose;   /* packets rcvd after "close" */
  383         u_int32_t tcps_rcvwinprobe;     /* rcvd window probe packets */
  384         u_int32_t tcps_rcvdupack;       /* rcvd duplicate acks */
  385         u_int32_t tcps_rcvacktoomuch;   /* rcvd acks for unsent data */
  386         u_int32_t tcps_rcvacktooold;    /* rcvd acks for old data */
  387         u_int32_t tcps_rcvackpack;      /* rcvd ack packets */
  388         u_int64_t tcps_rcvackbyte;      /* bytes acked by rcvd acks */
  389         u_int32_t tcps_rcvwinupd;       /* rcvd window update packets */
  390         u_int32_t tcps_pawsdrop;        /* segments dropped due to PAWS */
  391         u_int32_t tcps_predack;         /* times hdr predict ok for acks */
  392         u_int32_t tcps_preddat;         /* times hdr predict ok for data pkts */
  393 
  394         u_int32_t tcps_pcbhashmiss;     /* input packets missing pcb hash */
  395         u_int32_t tcps_noport;          /* no socket on port */
  396         u_int32_t tcps_badsyn;          /* SYN packet with src==dst rcv'ed */
  397         u_int32_t tcps_dropsyn;         /* SYN packet dropped */
  398 
  399         u_int32_t tcps_rcvbadsig;       /* rcvd bad/missing TCP signatures */
  400         u_int64_t tcps_rcvgoodsig;      /* rcvd good TCP signatures */
  401         u_int32_t tcps_inswcsum;        /* input software-checksummed packets */
  402         u_int32_t tcps_outswcsum;       /* output software-checksummed packets */
  403 
  404         /* ECN stats */
  405         u_int32_t tcps_ecn_accepts;     /* ecn connections accepted */
  406         u_int32_t tcps_ecn_rcvece;      /* # of rcvd ece */
  407         u_int32_t tcps_ecn_rcvcwr;      /* # of rcvd cwr */
  408         u_int32_t tcps_ecn_rcvce;       /* # of rcvd ce in ip header */
  409         u_int32_t tcps_ecn_sndect;      /* # of cwr sent */
  410         u_int32_t tcps_ecn_sndece;      /* # of ece sent */
  411         u_int32_t tcps_ecn_sndcwr;      /* # of cwr sent */
  412         u_int32_t tcps_cwr_ecn;         /* # of cwnd reduced by ecn */
  413         u_int32_t tcps_cwr_frecovery;   /* # of cwnd reduced by fastrecovery */
  414         u_int32_t tcps_cwr_timeout;     /* # of cwnd reduced by timeout */
  415 
  416         /* These statistics deal with the SYN cache. */
  417         u_int64_t tcps_sc_added;        /* # of entries added */
  418         u_int64_t tcps_sc_completed;    /* # of connections completed */
  419         u_int64_t tcps_sc_timed_out;    /* # of entries timed out */
  420         u_int64_t tcps_sc_overflowed;   /* # dropped due to overflow */
  421         u_int64_t tcps_sc_reset;        /* # dropped due to RST */
  422         u_int64_t tcps_sc_unreach;      /* # dropped due to ICMP unreach */
  423         u_int64_t tcps_sc_bucketoverflow;/* # dropped due to bucket overflow */
  424         u_int64_t tcps_sc_aborted;      /* # of entries aborted (no mem) */
  425         u_int64_t tcps_sc_dupesyn;      /* # of duplicate SYNs received */
  426         u_int64_t tcps_sc_dropped;      /* # of SYNs dropped (no route/mem) */
  427         u_int64_t tcps_sc_collisions;   /* # of hash collisions */
  428         u_int64_t tcps_sc_retransmitted;/* # of retransmissions */
  429         u_int64_t tcps_sc_seedrandom;   /* # of syn cache seeds with random */
  430         u_int64_t tcps_sc_hash_size;    /* hash buckets in current syn cache */
  431         u_int64_t tcps_sc_entry_count;  /* # of entries in current syn cache */
  432         u_int64_t tcps_sc_entry_limit;  /* limit of syn cache entries */
  433         u_int64_t tcps_sc_bucket_maxlen;/* maximum # of entries in any bucket */
  434         u_int64_t tcps_sc_bucket_limit; /* limit of syn cache bucket list */
  435         u_int64_t tcps_sc_uses_left;    /* use counter of current syn cache */
  436 
  437         u_int64_t tcps_conndrained;     /* # of connections drained */
  438 
  439         u_int64_t tcps_sack_recovery_episode;   /* SACK recovery episodes */
  440         u_int64_t tcps_sack_rexmits;            /* SACK rexmit segments */
  441         u_int64_t tcps_sack_rexmit_bytes;       /* SACK rexmit bytes */
  442         u_int64_t tcps_sack_rcv_opts;           /* SACK options received */
  443         u_int64_t tcps_sack_snd_opts;           /* SACK options sent */
  444         u_int64_t tcps_sack_drop_opts;          /* SACK options dropped */
  445 };
  446 
  447 /*
  448  * Names for TCP sysctl objects.
  449  */
  450 
  451 #define TCPCTL_RFC1323          1 /* enable/disable RFC1323 timestamps/scaling */
  452 #define TCPCTL_KEEPINITTIME     2 /* TCPT_KEEP value */
  453 #define TCPCTL_KEEPIDLE         3 /* allow tcp_keepidle to be changed */
  454 #define TCPCTL_KEEPINTVL        4 /* allow tcp_keepintvl to be changed */
  455 #define TCPCTL_SLOWHZ           5 /* return kernel idea of PR_SLOWHZ */
  456 #define TCPCTL_BADDYNAMIC       6 /* return bad dynamic port bitmap */
  457 #define TCPCTL_RECVSPACE        7 /* receive buffer space */
  458 #define TCPCTL_SENDSPACE        8 /* send buffer space */
  459 #define TCPCTL_IDENT            9 /* get connection owner */
  460 #define TCPCTL_SACK            10 /* selective acknowledgement, rfc 2018 */
  461 #define TCPCTL_MSSDFLT         11 /* Default maximum segment size */
  462 #define TCPCTL_RSTPPSLIMIT     12 /* RST pps limit */
  463 #define TCPCTL_ACK_ON_PUSH     13 /* ACK immediately on PUSH */
  464 #define TCPCTL_ECN             14 /* RFC3168 ECN */
  465 #define TCPCTL_SYN_CACHE_LIMIT 15 /* max size of comp. state engine */
  466 #define TCPCTL_SYN_BUCKET_LIMIT 16 /* max size of hash bucket */
  467 #define TCPCTL_RFC3390         17 /* enable/disable RFC3390 increased cwnd */
  468 #define TCPCTL_REASS_LIMIT     18 /* max entries for tcp reass queues */
  469 #define TCPCTL_DROP            19 /* drop tcp connection */
  470 #define TCPCTL_SACKHOLE_LIMIT  20 /* max entries for tcp sack queues */
  471 #define TCPCTL_STATS           21 /* TCP statistics */
  472 #define TCPCTL_ALWAYS_KEEPALIVE 22 /* assume SO_KEEPALIVE is always set */
  473 #define TCPCTL_SYN_USE_LIMIT   23 /* number of uses before reseeding hash */
  474 #define TCPCTL_ROOTONLY        24 /* return root only port bitmap */
  475 #define TCPCTL_SYN_HASH_SIZE   25 /* number of buckets in the hash */
  476 #define TCPCTL_MAXID           26
  477 
  478 #define TCPCTL_NAMES { \
  479         { 0, 0 }, \
  480         { "rfc1323",    CTLTYPE_INT }, \
  481         { "keepinittime",       CTLTYPE_INT }, \
  482         { "keepidle",   CTLTYPE_INT }, \
  483         { "keepintvl",  CTLTYPE_INT }, \
  484         { NULL, 0 }, \
  485         { "baddynamic", CTLTYPE_STRUCT }, \
  486         { NULL, 0 }, \
  487         { NULL, 0 }, \
  488         { "ident",      CTLTYPE_STRUCT }, \
  489         { "sack",       CTLTYPE_INT }, \
  490         { "mssdflt",    CTLTYPE_INT }, \
  491         { "rstppslimit",        CTLTYPE_INT }, \
  492         { "ackonpush",  CTLTYPE_INT }, \
  493         { "ecn",        CTLTYPE_INT }, \
  494         { "syncachelimit",      CTLTYPE_INT }, \
  495         { "synbucketlimit",     CTLTYPE_INT }, \
  496         { "rfc3390",    CTLTYPE_INT }, \
  497         { "reasslimit",         CTLTYPE_INT }, \
  498         { "drop",       CTLTYPE_STRUCT }, \
  499         { "sackholelimit",      CTLTYPE_INT }, \
  500         { "stats",      CTLTYPE_STRUCT }, \
  501         { "always_keepalive",   CTLTYPE_INT }, \
  502         { "synuselimit",        CTLTYPE_INT }, \
  503         { "rootonly", CTLTYPE_STRUCT }, \
  504         { "synhashsize",        CTLTYPE_INT }, \
  505 }
  506 
  507 struct tcp_ident_mapping {
  508         struct sockaddr_storage faddr, laddr;
  509         int euid, ruid;
  510         u_int rdomain;
  511 };
  512 
  513 #ifdef _KERNEL
  514 
  515 #include <sys/percpu.h>
  516 #include <sys/stat.h>
  517 
  518 enum tcpstat_counters {
  519         tcps_connattempt,
  520         tcps_accepts,
  521         tcps_connects,
  522         tcps_drops,
  523         tcps_conndrops,
  524         tcps_closed,
  525         tcps_segstimed,
  526         tcps_rttupdated,
  527         tcps_delack,
  528         tcps_timeoutdrop,
  529         tcps_rexmttimeo,
  530         tcps_persisttimeo,
  531         tcps_persistdrop,
  532         tcps_keeptimeo,
  533         tcps_keepprobe,
  534         tcps_keepdrops,
  535         tcps_sndtotal,
  536         tcps_sndpack,
  537         tcps_sndbyte,
  538         tcps_sndrexmitpack,
  539         tcps_sndrexmitbyte,
  540         tcps_sndrexmitfast,
  541         tcps_sndacks,
  542         tcps_sndprobe,
  543         tcps_sndurg,
  544         tcps_sndwinup,
  545         tcps_sndctrl,
  546         tcps_rcvtotal,
  547         tcps_rcvpack,
  548         tcps_rcvbyte,
  549         tcps_rcvbadsum,
  550         tcps_rcvbadoff,
  551         tcps_rcvmemdrop,
  552         tcps_rcvnosec,
  553         tcps_rcvshort,
  554         tcps_rcvduppack,
  555         tcps_rcvdupbyte,
  556         tcps_rcvpartduppack,
  557         tcps_rcvpartdupbyte,
  558         tcps_rcvoopack,
  559         tcps_rcvoobyte,
  560         tcps_rcvpackafterwin,
  561         tcps_rcvbyteafterwin,
  562         tcps_rcvafterclose,
  563         tcps_rcvwinprobe,
  564         tcps_rcvdupack,
  565         tcps_rcvacktoomuch,
  566         tcps_rcvacktooold,
  567         tcps_rcvackpack,
  568         tcps_rcvackbyte,
  569         tcps_rcvwinupd,
  570         tcps_pawsdrop,
  571         tcps_predack,
  572         tcps_preddat,
  573         tcps_pcbhashmiss,
  574         tcps_noport,
  575         tcps_badsyn,
  576         tcps_dropsyn,
  577         tcps_rcvbadsig,
  578         tcps_rcvgoodsig,
  579         tcps_inswcsum,
  580         tcps_outswcsum,
  581         tcps_ecn_accepts,
  582         tcps_ecn_rcvece,
  583         tcps_ecn_rcvcwr,
  584         tcps_ecn_rcvce,
  585         tcps_ecn_sndect,
  586         tcps_ecn_sndece,
  587         tcps_ecn_sndcwr,
  588         tcps_cwr_ecn,
  589         tcps_cwr_frecovery,
  590         tcps_cwr_timeout,
  591         tcps_sc_added,
  592         tcps_sc_completed,
  593         tcps_sc_timed_out,
  594         tcps_sc_overflowed,
  595         tcps_sc_reset,
  596         tcps_sc_unreach,
  597         tcps_sc_bucketoverflow,
  598         tcps_sc_aborted,
  599         tcps_sc_dupesyn,
  600         tcps_sc_dropped,
  601         tcps_sc_collisions,
  602         tcps_sc_retransmitted,
  603         tcps_sc_seedrandom,
  604         tcps_sc_hash_size,
  605         tcps_sc_entry_count,
  606         tcps_sc_entry_limit,
  607         tcps_sc_bucket_maxlen,
  608         tcps_sc_bucket_limit,
  609         tcps_sc_uses_left,
  610         tcps_conndrained,
  611         tcps_sack_recovery_episode,
  612         tcps_sack_rexmits,
  613         tcps_sack_rexmit_bytes,
  614         tcps_sack_rcv_opts,
  615         tcps_sack_snd_opts,
  616         tcps_sack_drop_opts,
  617         tcps_ncounters,
  618 };
  619 
  620 extern struct cpumem *tcpcounters;
  621 
  622 static inline void
  623 tcpstat_inc(enum tcpstat_counters c)
  624 {
  625         counters_inc(tcpcounters, c);
  626 }
  627 
  628 static inline void
  629 tcpstat_add(enum tcpstat_counters c, uint64_t v)
  630 {
  631         counters_add(tcpcounters, c, v);
  632 }
  633 
  634 static inline void
  635 tcpstat_pkt(enum tcpstat_counters pcounter, enum tcpstat_counters bcounter,
  636     uint64_t v)
  637 {
  638         counters_pkt(tcpcounters, pcounter, bcounter, v);
  639 }
  640 
  641 static inline uint32_t
  642 tcp_now(void)
  643 {
  644         return (getnsecruntime() / 1000000);
  645 }
  646 
  647 #define TCP_TIME_MSEC(_ms)      (_ms)   /* tcp_now() is in milliseconds */
  648 #define TCP_TIME(_sec)          ((_sec) * 1000)
  649 
  650 extern  struct mutex tcp_timer_mtx;
  651 extern  const struct pr_usrreqs tcp_usrreqs;
  652 
  653 #ifdef INET6
  654 extern  const struct pr_usrreqs tcp6_usrreqs;
  655 #endif
  656 
  657 extern  struct pool tcpcb_pool;
  658 extern  struct inpcbtable tcbtable;     /* head of queue of active tcpcb's */
  659 extern  int tcp_do_rfc1323;     /* enabled/disabled? */
  660 extern  int tcptv_keep_init;    /* time to keep alive the initial SYN packet */
  661 extern  int tcp_mssdflt;        /* default maximum segment size */
  662 extern  int tcp_rst_ppslim;     /* maximum outgoing RST packet per second */
  663 extern  int tcp_ack_on_push;    /* ACK immediately on PUSH */
  664 extern  int tcp_do_sack;        /* SACK enabled/disabled */
  665 extern  struct pool sackhl_pool;
  666 extern  int tcp_sackhole_limit; /* max entries for tcp sack queues */
  667 extern  int tcp_do_ecn;         /* RFC3168 ECN enabled/disabled? */
  668 extern  int tcp_do_rfc3390;     /* RFC3390 Increasing TCP's Initial Window */
  669 
  670 extern  struct pool tcpqe_pool;
  671 extern  int tcp_reass_limit;    /* max entries for tcp reass queues */
  672 
  673 extern  int tcp_syn_hash_size;  /* adjustable size of the hash array */
  674 extern  int tcp_syn_cache_limit; /* max entries for compressed state engine */
  675 extern  int tcp_syn_bucket_limit;/* max entries per hash bucket */
  676 extern  int tcp_syn_use_limit;   /* number of uses before reseeding hash */
  677 extern  struct syn_cache_set tcp_syn_cache[];
  678 extern  int tcp_syn_cache_active; /* active syn cache, may be 0 or 1 */
  679 
  680 void     tcp_canceltimers(struct tcpcb *);
  681 struct tcpcb *
  682          tcp_close(struct tcpcb *);
  683 int      tcp_freeq(struct tcpcb *);
  684 #ifdef INET6
  685 void     tcp6_ctlinput(int, struct sockaddr *, u_int, void *);
  686 #endif
  687 void     tcp_ctlinput(int, struct sockaddr *, u_int, void *);
  688 int      tcp_ctloutput(int, struct socket *, int, int, struct mbuf *);
  689 struct tcpcb *
  690          tcp_dodisconnect(struct tcpcb *);
  691 struct tcpcb *
  692          tcp_drop(struct tcpcb *, int);
  693 int      tcp_dooptions(struct tcpcb *, u_char *, int, struct tcphdr *,
  694                 struct mbuf *, int, struct tcp_opt_info *, u_int, uint32_t);
  695 void     tcp_init(void);
  696 int      tcp_input(struct mbuf **, int *, int, int);
  697 int      tcp_mss(struct tcpcb *, int);
  698 void     tcp_mss_update(struct tcpcb *);
  699 u_int    tcp_hdrsz(struct tcpcb *);
  700 void     tcp_mtudisc(struct inpcb *, int);
  701 void     tcp_mtudisc_increase(struct inpcb *, int);
  702 #ifdef INET6
  703 void    tcp6_mtudisc(struct inpcb *, int);
  704 void    tcp6_mtudisc_callback(struct sockaddr_in6 *, u_int);
  705 #endif
  706 struct tcpcb *
  707          tcp_newtcpcb(struct inpcb *, int);
  708 void     tcp_notify(struct inpcb *, int);
  709 int      tcp_output(struct tcpcb *);
  710 void     tcp_pulloutofband(struct socket *, u_int, struct mbuf *, int);
  711 int      tcp_reass(struct tcpcb *, struct tcphdr *, struct mbuf *, int *);
  712 void     tcp_rscale(struct tcpcb *, u_long);
  713 void     tcp_respond(struct tcpcb *, caddr_t, struct tcphdr *, tcp_seq,
  714                 tcp_seq, int, u_int, uint32_t);
  715 void     tcp_setpersist(struct tcpcb *);
  716 void     tcp_update_sndspace(struct tcpcb *);
  717 void     tcp_update_rcvspace(struct tcpcb *);
  718 void     tcp_slowtimo(void);
  719 struct mbuf *
  720          tcp_template(struct tcpcb *);
  721 #ifndef SMALL_KERNEL
  722 void     tcp_trace(short, short, struct tcpcb *, struct tcpcb *, caddr_t,
  723                 int, int);
  724 #endif
  725 struct tcpcb *
  726          tcp_usrclosed(struct tcpcb *);
  727 int      tcp_sysctl(int *, u_int, void *, size_t *, void *, size_t);
  728 int      tcp_attach(struct socket *, int, int);
  729 int      tcp_detach(struct socket *);
  730 int      tcp_bind(struct socket *, struct mbuf *, struct proc *);
  731 int      tcp_listen(struct socket *);
  732 int      tcp_connect(struct socket *, struct mbuf *);
  733 int      tcp_accept(struct socket *, struct mbuf *);
  734 int      tcp_disconnect(struct socket *);
  735 int      tcp_shutdown(struct socket *);
  736 void     tcp_rcvd(struct socket *);
  737 int      tcp_send(struct socket *, struct mbuf *, struct mbuf *,
  738              struct mbuf *);
  739 void     tcp_abort(struct socket *);
  740 int      tcp_sockaddr(struct socket *, struct mbuf *);
  741 int      tcp_peeraddr(struct socket *, struct mbuf *);
  742 int      tcp_sense(struct socket *, struct stat *);
  743 int      tcp_rcvoob(struct socket *, struct mbuf *, int);
  744 int      tcp_sendoob(struct socket *, struct mbuf *, struct mbuf *,
  745              struct mbuf *);
  746 void     tcp_xmit_timer(struct tcpcb *, int);
  747 void     tcpdropoldhalfopen(struct tcpcb *, u_int16_t);
  748 void     tcp_sack_option(struct tcpcb *,struct tcphdr *,u_char *,int);
  749 void     tcp_update_sack_list(struct tcpcb *tp, tcp_seq, tcp_seq);
  750 void     tcp_del_sackholes(struct tcpcb *, struct tcphdr *);
  751 void     tcp_clean_sackreport(struct tcpcb *tp);
  752 void     tcp_sack_adjust(struct tcpcb *tp);
  753 struct sackhole *
  754          tcp_sack_output(struct tcpcb *tp);
  755 #ifdef DEBUG
  756 void     tcp_print_holes(struct tcpcb *tp);
  757 #endif
  758 u_long   tcp_seq_subtract(u_long, u_long );
  759 #ifdef TCP_SIGNATURE
  760 int     tcp_signature_apply(caddr_t, caddr_t, unsigned int);
  761 int     tcp_signature(struct tdb *, int, struct mbuf *, struct tcphdr *,
  762             int, int, char *);
  763 #endif /* TCP_SIGNATURE */
  764 void     tcp_set_iss_tsm(struct tcpcb *);
  765 
  766 void     syn_cache_unreach(struct sockaddr *, struct sockaddr *,
  767            struct tcphdr *, u_int);
  768 void     syn_cache_init(void);
  769 void     syn_cache_cleanup(struct tcpcb *);
  770 
  771 #ifdef SMALL_KERNEL
  772 static inline void
  773 tcp_trace(short act, short ostate, struct tcpcb *tp, struct tcpcb *otp,
  774     caddr_t headers, int req, int len)
  775 {
  776 }
  777 #endif
  778 
  779 #endif /* _KERNEL */
  780 #endif /* _NETINET_TCP_VAR_H_ */

Cache object: d4e84aff6360aa8d48d72494bbb3b226


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