LCOV - code coverage report
Current view: top level - netinet - tcp_var.h (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 9 0.0 %
Date: 2018-10-19 03:25:38 Functions: 0 3 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*      $OpenBSD: tcp_var.h,v 1.133 2018/06/11 07:40:26 bluhm 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             :         short   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       0x0001          /* ack peer immediately */
      81             : #define TF_NODELAY      0x0004          /* don't delay packets to coalesce */
      82             : #define TF_NOOPT        0x0008          /* don't use tcp options */
      83             : #define TF_SENTFIN      0x0010          /* have sent FIN */
      84             : #define TF_REQ_SCALE    0x0020          /* have/will request window scaling */
      85             : #define TF_RCVD_SCALE   0x0040          /* other side has requested scaling */
      86             : #define TF_REQ_TSTMP    0x0080          /* have/will request timestamps */
      87             : #define TF_RCVD_TSTMP   0x0100          /* a timestamp was received in SYN */
      88             : #define TF_SACK_PERMIT  0x0200          /* other side said I could SACK */
      89             : #define TF_SIGNATURE    0x0400          /* require TCP MD5 signature */
      90             : #ifdef TCP_ECN
      91             : #define TF_ECN_PERMIT   0x00008000      /* other side said I could ECN */
      92             : #define TF_RCVD_CE      0x00010000      /* send ECE in subsequent segs */
      93             : #define TF_SEND_CWR     0x00020000      /* send CWR in next seg */
      94             : #define TF_DISABLE_ECN  0x00040000      /* disable ECN for this connection */
      95             : #endif
      96             : #define TF_LASTIDLE     0x00100000      /* no outstanding ACK on last send */
      97             : #define TF_PMTUD_PEND   0x00400000      /* Path MTU Discovery pending */
      98             : #define TF_NEEDOUTPUT   0x00800000      /* call tcp_output after tcp_input */
      99             : #define TF_BLOCKOUTPUT  0x01000000      /* avert tcp_output during tcp_input */
     100             : #define TF_NOPUSH       0x02000000      /* don't push */
     101             : #define TF_TMR_REXMT    0x04000000      /* retransmit timer armed */
     102             : #define TF_TMR_PERSIST  0x08000000      /* retransmit persistence timer armed */
     103             : #define TF_TMR_KEEP     0x10000000      /* keep alive timer armed */
     104             : #define TF_TMR_2MSL     0x20000000      /* 2*msl quiet time timer armed */
     105             : #define TF_TMR_REAPER   0x40000000      /* delayed cleanup timer armed, dead */
     106             : #define TF_TMR_DELACK   0x80000000      /* 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_rtttime;             /* time we started measuring rtt */
     165             :         tcp_seq t_rtseq;                /* sequence number being timed */
     166             :         short   t_srtt;                 /* smoothed round-trip time */
     167             :         short   t_rttvar;               /* variance in round-trip time */
     168             :         u_short t_rttmin;               /* minimum rtt allowed */
     169             :         u_long  max_sndwnd;             /* largest window peer has offered */
     170             : 
     171             : /* out-of-band data */
     172             :         char    t_oobflags;             /* have some */
     173             :         char    t_iobc;                 /* input character */
     174             : #define TCPOOB_HAVEDATA 0x01
     175             : #define TCPOOB_HADDATA  0x02
     176             :         short   t_softerror;            /* possible error not yet reported */
     177             : 
     178             : /* RFC 1323 variables */
     179             :         u_char  snd_scale;              /* window scaling for send window */
     180             :         u_char  rcv_scale;              /* window scaling for recv window */
     181             :         u_char  request_r_scale;        /* pending window scaling */
     182             :         u_char  requested_s_scale;
     183             :         u_int32_t ts_recent;            /* timestamp echo data */
     184             :         u_int32_t ts_modulate;          /* modulation on timestamp */
     185             :         u_int32_t ts_recent_age;                /* when last updated */
     186             :         tcp_seq last_ack_sent;
     187             : 
     188             : /* pointer for syn cache entries*/
     189             :         LIST_HEAD(, syn_cache) t_sc;    /* list of entries by this tcb */
     190             : 
     191             : /* Path-MTU Discovery Information */
     192             :         u_int   t_pmtud_mss_acked;      /* MSS acked, lower bound for MTU */
     193             :         u_int   t_pmtud_mtu_sent;       /* MTU used, upper bound for MTU */
     194             :         tcp_seq t_pmtud_th_seq;         /* TCP SEQ from ICMP payload */
     195             :         u_int   t_pmtud_nextmtu;        /* Advertised Next-Hop MTU from ICMP */
     196             :         u_short t_pmtud_ip_len;         /* IP length from ICMP payload */
     197             :         u_short t_pmtud_ip_hl;          /* IP header length from ICMP payload */
     198             : 
     199             :         int pf;
     200             : };
     201             : 
     202             : #define intotcpcb(ip)   ((struct tcpcb *)(ip)->inp_ppcb)
     203             : #define sototcpcb(so)   (intotcpcb(sotoinpcb(so)))
     204             : 
     205             : #ifdef _KERNEL
     206             : /*
     207             :  * Handy way of passing around TCP option info.
     208             :  */
     209             : struct tcp_opt_info {
     210             :         int             ts_present;
     211             :         u_int32_t       ts_val;
     212             :         u_int32_t       ts_ecr;
     213             :         u_int16_t       maxseg;
     214             : };
     215             : 
     216             : /*
     217             :  * Data for the TCP compressed state engine.
     218             :  */
     219             : 
     220             : #define TCP_SYN_HASH_SIZE       293
     221             : #define TCP_SYN_BUCKET_SIZE     35
     222             : 
     223             : union syn_cache_sa {
     224             :         struct sockaddr sa;
     225             :         struct sockaddr_in sin;
     226             :         struct sockaddr_in6 sin6;
     227             : };
     228             : 
     229             : struct syn_cache {
     230             :         TAILQ_ENTRY(syn_cache) sc_bucketq;      /* link on bucket list */
     231             :         struct timeout sc_timer;                /* rexmt timer */
     232             :         union {                                 /* cached route */
     233             :                 struct route route4;
     234             : #ifdef INET6
     235             :                 struct route_in6 route6;
     236             : #endif
     237             :         } sc_route_u;
     238             : #define sc_route4       sc_route_u.route4
     239             : #ifdef INET6
     240             : #define sc_route6       sc_route_u.route6
     241             : #endif
     242             :         long sc_win;                            /* advertised window */
     243             :         struct syn_cache_head *sc_buckethead;   /* our bucket index */
     244             :         struct syn_cache_set *sc_set;           /* our syn cache set */
     245             :         u_int32_t sc_hash;
     246             :         u_int32_t sc_timestamp;                 /* timestamp from SYN */
     247             :         u_int32_t sc_modulate;                  /* our timestamp modulator */
     248             : #if 0
     249             :         u_int32_t sc_timebase;                  /* our local timebase */
     250             : #endif
     251             :         union syn_cache_sa sc_src;
     252             :         union syn_cache_sa sc_dst;
     253             :         tcp_seq sc_irs;
     254             :         tcp_seq sc_iss;
     255             :         u_int sc_rtableid;
     256             :         u_int sc_rxtcur;                        /* current rxt timeout */
     257             :         u_int sc_rxttot;                        /* total time spend on queues */
     258             :         u_short sc_rxtshift;                    /* for computing backoff */
     259             :         u_short sc_flags;
     260             : 
     261             : #define SCF_UNREACH             0x0001          /* we've had an unreach error */
     262             : #define SCF_TIMESTAMP           0x0002          /* peer will do timestamps */
     263             : #define SCF_DEAD                0x0004          /* this entry to be released */
     264             : #define SCF_SACK_PERMIT         0x0008          /* permit sack */
     265             : #define SCF_ECN_PERMIT          0x0010          /* permit ecn */
     266             : #define SCF_SIGNATURE           0x0020          /* enforce tcp signatures */
     267             : 
     268             :         struct mbuf *sc_ipopts;                 /* IP options */
     269             :         u_int16_t sc_peermaxseg;
     270             :         u_int16_t sc_ourmaxseg;
     271             :         u_int     sc_request_r_scale    : 4,
     272             :                   sc_requested_s_scale  : 4;
     273             : 
     274             :         struct tcpcb *sc_tp;                    /* tcb for listening socket */
     275             :         LIST_ENTRY(syn_cache) sc_tpq;           /* list of entries by same tp */
     276             : };
     277             : 
     278             : struct syn_cache_head {
     279             :         TAILQ_HEAD(, syn_cache) sch_bucket;     /* bucket entries */
     280             :         u_short sch_length;                     /* # entries in bucket */
     281             : };
     282             : 
     283             : struct syn_cache_set {
     284             :         struct          syn_cache_head *scs_buckethead;
     285             :         int             scs_size;
     286             :         int             scs_count;
     287             :         int             scs_use;
     288             :         u_int32_t       scs_random[5];
     289             : };
     290             : 
     291             : #endif /* _KERNEL */
     292             : 
     293             : /*
     294             :  * The smoothed round-trip time and estimated variance
     295             :  * are stored as fixed point numbers scaled by the values below.
     296             :  * For convenience, these scales are also used in smoothing the average
     297             :  * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed).
     298             :  * With these scales, srtt has 5 bits to the right of the binary point,
     299             :  * and thus an "ALPHA" of 0.875.  rttvar has 4 bits to the right of the
     300             :  * binary point, and is smoothed with an ALPHA of 0.75.
     301             :  */
     302             : #define TCP_RTT_SHIFT           3       /* shift for srtt; 5 bits frac. */
     303             : #define TCP_RTTVAR_SHIFT        2       /* shift for rttvar; 4 bits */
     304             : #define TCP_RTT_BASE_SHIFT      2       /* remaining 2 bit shift */
     305             : #define TCP_RTT_MAX             (1<<9)    /* maximum rtt */
     306             : 
     307             : /*
     308             :  * The initial retransmission should happen at rtt + 4 * rttvar.
     309             :  * Because of the way we do the smoothing, srtt and rttvar
     310             :  * will each average +1/2 tick of bias.  When we compute
     311             :  * the retransmit timer, we want 1/2 tick of rounding and
     312             :  * 1 extra tick because of +-1/2 tick uncertainty in the
     313             :  * firing of the timer.  The bias will give us exactly the
     314             :  * 1.5 tick we need.  But, because the bias is
     315             :  * statistical, we have to test that we don't drop below
     316             :  * the minimum feasible timer (which is 2 ticks).
     317             :  * This macro assumes that the value of (1 << TCP_RTTVAR_SHIFT)
     318             :  * is the same as the multiplier for rttvar.
     319             :  */
     320             : #define TCP_REXMTVAL(tp) \
     321             :         ((((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) >> TCP_RTT_BASE_SHIFT)
     322             : 
     323             : /*
     324             :  * TCP statistics.
     325             :  * Many of these should be kept per connection,
     326             :  * but that's inconvenient at the moment.
     327             :  */
     328             : struct  tcpstat {
     329             :         u_int32_t tcps_connattempt;     /* connections initiated */
     330             :         u_int32_t tcps_accepts;         /* connections accepted */
     331             :         u_int32_t tcps_connects;        /* connections established */
     332             :         u_int32_t tcps_drops;           /* connections dropped */
     333             :         u_int32_t tcps_conndrops;       /* embryonic connections dropped */
     334             :         u_int32_t tcps_closed;          /* conn. closed (includes drops) */
     335             :         u_int32_t tcps_segstimed;       /* segs where we tried to get rtt */
     336             :         u_int32_t tcps_rttupdated;      /* times we succeeded */
     337             :         u_int32_t tcps_delack;          /* delayed acks sent */
     338             :         u_int32_t tcps_timeoutdrop;     /* conn. dropped in rxmt timeout */
     339             :         u_int32_t tcps_rexmttimeo;      /* retransmit timeouts */
     340             :         u_int32_t tcps_persisttimeo;    /* persist timeouts */
     341             :         u_int32_t tcps_persistdrop;     /* connections dropped in persist */
     342             :         u_int32_t tcps_keeptimeo;       /* keepalive timeouts */
     343             :         u_int32_t tcps_keepprobe;       /* keepalive probes sent */
     344             :         u_int32_t tcps_keepdrops;       /* connections dropped in keepalive */
     345             : 
     346             :         u_int32_t tcps_sndtotal;                /* total packets sent */
     347             :         u_int32_t tcps_sndpack;         /* data packets sent */
     348             :         u_int64_t tcps_sndbyte;         /* data bytes sent */
     349             :         u_int32_t tcps_sndrexmitpack;   /* data packets retransmitted */
     350             :         u_int64_t tcps_sndrexmitbyte;   /* data bytes retransmitted */
     351             :         u_int64_t tcps_sndrexmitfast;   /* Fast retransmits */
     352             :         u_int32_t tcps_sndacks;         /* ack-only packets sent */
     353             :         u_int32_t tcps_sndprobe;        /* window probes sent */
     354             :         u_int32_t tcps_sndurg;          /* packets sent with URG only */
     355             :         u_int32_t tcps_sndwinup;        /* window update-only packets sent */
     356             :         u_int32_t tcps_sndctrl;         /* control (SYN|FIN|RST) packets sent */
     357             : 
     358             :         u_int32_t tcps_rcvtotal;        /* total packets received */
     359             :         u_int32_t tcps_rcvpack;         /* packets received in sequence */
     360             :         u_int64_t tcps_rcvbyte;         /* bytes received in sequence */
     361             :         u_int32_t tcps_rcvbadsum;       /* packets received with ccksum errs */
     362             :         u_int32_t tcps_rcvbadoff;       /* packets received with bad offset */
     363             :         u_int32_t tcps_rcvmemdrop;      /* packets dropped for lack of memory */
     364             :         u_int32_t tcps_rcvnosec;        /* packets dropped for lack of ipsec */
     365             :         u_int32_t tcps_rcvshort;        /* packets received too short */
     366             :         u_int32_t tcps_rcvduppack;      /* duplicate-only packets received */
     367             :         u_int64_t tcps_rcvdupbyte;      /* duplicate-only bytes received */
     368             :         u_int32_t tcps_rcvpartduppack;  /* packets with some duplicate data */
     369             :         u_int64_t tcps_rcvpartdupbyte;  /* dup. bytes in part-dup. packets */
     370             :         u_int32_t tcps_rcvoopack;       /* out-of-order packets received */
     371             :         u_int64_t tcps_rcvoobyte;       /* out-of-order bytes received */
     372             :         u_int32_t tcps_rcvpackafterwin; /* packets with data after window */
     373             :         u_int64_t tcps_rcvbyteafterwin; /* bytes rcvd after window */
     374             :         u_int32_t tcps_rcvafterclose;   /* packets rcvd after "close" */
     375             :         u_int32_t tcps_rcvwinprobe;     /* rcvd window probe packets */
     376             :         u_int32_t tcps_rcvdupack;       /* rcvd duplicate acks */
     377             :         u_int32_t tcps_rcvacktoomuch;   /* rcvd acks for unsent data */
     378             :         u_int32_t tcps_rcvacktooold;    /* rcvd acks for old data */
     379             :         u_int32_t tcps_rcvackpack;      /* rcvd ack packets */
     380             :         u_int64_t tcps_rcvackbyte;      /* bytes acked by rcvd acks */
     381             :         u_int32_t tcps_rcvwinupd;       /* rcvd window update packets */
     382             :         u_int32_t tcps_pawsdrop;        /* segments dropped due to PAWS */
     383             :         u_int32_t tcps_predack;         /* times hdr predict ok for acks */
     384             :         u_int32_t tcps_preddat;         /* times hdr predict ok for data pkts */
     385             : 
     386             :         u_int32_t tcps_pcbhashmiss;     /* input packets missing pcb hash */
     387             :         u_int32_t tcps_noport;          /* no socket on port */
     388             :         u_int32_t tcps_badsyn;          /* SYN packet with src==dst rcv'ed */
     389             :         u_int32_t tcps_dropsyn;         /* SYN packet dropped */
     390             : 
     391             :         u_int32_t tcps_rcvbadsig;       /* rcvd bad/missing TCP signatures */
     392             :         u_int64_t tcps_rcvgoodsig;      /* rcvd good TCP signatures */
     393             :         u_int32_t tcps_inswcsum;        /* input software-checksummed packets */
     394             :         u_int32_t tcps_outswcsum;       /* output software-checksummed packets */
     395             : 
     396             :         /* ECN stats */
     397             :         u_int32_t tcps_ecn_accepts;     /* ecn connections accepted */
     398             :         u_int32_t tcps_ecn_rcvece;      /* # of rcvd ece */
     399             :         u_int32_t tcps_ecn_rcvcwr;      /* # of rcvd cwr */
     400             :         u_int32_t tcps_ecn_rcvce;       /* # of rcvd ce in ip header */
     401             :         u_int32_t tcps_ecn_sndect;      /* # of cwr sent */
     402             :         u_int32_t tcps_ecn_sndece;      /* # of ece sent */
     403             :         u_int32_t tcps_ecn_sndcwr;      /* # of cwr sent */
     404             :         u_int32_t tcps_cwr_ecn;         /* # of cwnd reduced by ecn */
     405             :         u_int32_t tcps_cwr_frecovery;   /* # of cwnd reduced by fastrecovery */
     406             :         u_int32_t tcps_cwr_timeout;     /* # of cwnd reduced by timeout */
     407             : 
     408             :         /* These statistics deal with the SYN cache. */
     409             :         u_int64_t tcps_sc_added;        /* # of entries added */
     410             :         u_int64_t tcps_sc_completed;    /* # of connections completed */
     411             :         u_int64_t tcps_sc_timed_out;    /* # of entries timed out */
     412             :         u_int64_t tcps_sc_overflowed;   /* # dropped due to overflow */
     413             :         u_int64_t tcps_sc_reset;        /* # dropped due to RST */
     414             :         u_int64_t tcps_sc_unreach;      /* # dropped due to ICMP unreach */
     415             :         u_int64_t tcps_sc_bucketoverflow;/* # dropped due to bucket overflow */
     416             :         u_int64_t tcps_sc_aborted;      /* # of entries aborted (no mem) */
     417             :         u_int64_t tcps_sc_dupesyn;      /* # of duplicate SYNs received */
     418             :         u_int64_t tcps_sc_dropped;      /* # of SYNs dropped (no route/mem) */
     419             :         u_int64_t tcps_sc_collisions;   /* # of hash collisions */
     420             :         u_int64_t tcps_sc_retransmitted;/* # of retransmissions */
     421             :         u_int64_t tcps_sc_seedrandom;   /* # of syn cache seeds with random */
     422             :         u_int64_t tcps_sc_hash_size;    /* hash buckets in current syn cache */
     423             :         u_int64_t tcps_sc_entry_count;  /* # of entries in current syn cache */
     424             :         u_int64_t tcps_sc_entry_limit;  /* limit of syn cache entries */
     425             :         u_int64_t tcps_sc_bucket_maxlen;/* maximum # of entries in any bucket */
     426             :         u_int64_t tcps_sc_bucket_limit; /* limit of syn cache bucket list */
     427             :         u_int64_t tcps_sc_uses_left;    /* use counter of current syn cache */
     428             : 
     429             :         u_int64_t tcps_conndrained;     /* # of connections drained */
     430             : 
     431             :         u_int64_t tcps_sack_recovery_episode;   /* SACK recovery episodes */
     432             :         u_int64_t tcps_sack_rexmits;            /* SACK rexmit segments */
     433             :         u_int64_t tcps_sack_rexmit_bytes;       /* SACK rexmit bytes */
     434             :         u_int64_t tcps_sack_rcv_opts;           /* SACK options received */
     435             :         u_int64_t tcps_sack_snd_opts;           /* SACK options sent */
     436             : };
     437             : 
     438             : /*
     439             :  * Names for TCP sysctl objects.
     440             :  */
     441             : 
     442             : #define TCPCTL_RFC1323          1 /* enable/disable RFC1323 timestamps/scaling */
     443             : #define TCPCTL_KEEPINITTIME     2 /* TCPT_KEEP value */
     444             : #define TCPCTL_KEEPIDLE         3 /* allow tcp_keepidle to be changed */
     445             : #define TCPCTL_KEEPINTVL        4 /* allow tcp_keepintvl to be changed */
     446             : #define TCPCTL_SLOWHZ           5 /* return kernel idea of PR_SLOWHZ */
     447             : #define TCPCTL_BADDYNAMIC       6 /* return bad dynamic port bitmap */
     448             : #define TCPCTL_RECVSPACE        7 /* receive buffer space */
     449             : #define TCPCTL_SENDSPACE        8 /* send buffer space */
     450             : #define TCPCTL_IDENT            9 /* get connection owner */
     451             : #define TCPCTL_SACK            10 /* selective acknowledgement, rfc 2018 */
     452             : #define TCPCTL_MSSDFLT         11 /* Default maximum segment size */
     453             : #define TCPCTL_RSTPPSLIMIT     12 /* RST pps limit */
     454             : #define TCPCTL_ACK_ON_PUSH     13 /* ACK immediately on PUSH */
     455             : #define TCPCTL_ECN             14 /* RFC3168 ECN */
     456             : #define TCPCTL_SYN_CACHE_LIMIT 15 /* max size of comp. state engine */
     457             : #define TCPCTL_SYN_BUCKET_LIMIT 16 /* max size of hash bucket */
     458             : #define TCPCTL_RFC3390         17 /* enable/disable RFC3390 increased cwnd */
     459             : #define TCPCTL_REASS_LIMIT     18 /* max entries for tcp reass queues */
     460             : #define TCPCTL_DROP            19 /* drop tcp connection */
     461             : #define TCPCTL_SACKHOLE_LIMIT  20 /* max entries for tcp sack queues */
     462             : #define TCPCTL_STATS           21 /* TCP statistics */
     463             : #define TCPCTL_ALWAYS_KEEPALIVE 22 /* assume SO_KEEPALIVE is always set */
     464             : #define TCPCTL_SYN_USE_LIMIT   23 /* number of uses before reseeding hash */
     465             : #define TCPCTL_ROOTONLY        24 /* return root only port bitmap */
     466             : #define TCPCTL_SYN_HASH_SIZE   25 /* number of buckets in the hash */
     467             : #define TCPCTL_MAXID           26
     468             : 
     469             : #define TCPCTL_NAMES { \
     470             :         { 0, 0 }, \
     471             :         { "rfc1323",  CTLTYPE_INT }, \
     472             :         { "keepinittime",     CTLTYPE_INT }, \
     473             :         { "keepidle", CTLTYPE_INT }, \
     474             :         { "keepintvl",        CTLTYPE_INT }, \
     475             :         { "slowhz",   CTLTYPE_INT }, \
     476             :         { "baddynamic", CTLTYPE_STRUCT }, \
     477             :         { NULL, 0 }, \
     478             :         { NULL, 0 }, \
     479             :         { "ident",    CTLTYPE_STRUCT }, \
     480             :         { "sack",     CTLTYPE_INT }, \
     481             :         { "mssdflt",  CTLTYPE_INT }, \
     482             :         { "rstppslimit",      CTLTYPE_INT }, \
     483             :         { "ackonpush",        CTLTYPE_INT }, \
     484             :         { "ecn",      CTLTYPE_INT }, \
     485             :         { "syncachelimit",    CTLTYPE_INT }, \
     486             :         { "synbucketlimit",   CTLTYPE_INT }, \
     487             :         { "rfc3390",  CTLTYPE_INT }, \
     488             :         { "reasslimit",       CTLTYPE_INT }, \
     489             :         { "drop",     CTLTYPE_STRUCT }, \
     490             :         { "sackholelimit",    CTLTYPE_INT }, \
     491             :         { "stats",    CTLTYPE_STRUCT }, \
     492             :         { "always_keepalive", CTLTYPE_INT }, \
     493             :         { "synuselimit",      CTLTYPE_INT }, \
     494             :         { "rootonly", CTLTYPE_STRUCT }, \
     495             :         { "synhashsize",      CTLTYPE_INT }, \
     496             : }
     497             : 
     498             : #define TCPCTL_VARS { \
     499             :         NULL, \
     500             :         &tcp_do_rfc1323, \
     501             :         &tcptv_keep_init, \
     502             :         &tcp_keepidle, \
     503             :         &tcp_keepintvl, \
     504             :         NULL, \
     505             :         NULL, \
     506             :         NULL, \
     507             :         NULL, \
     508             :         NULL, \
     509             :         NULL, \
     510             :         &tcp_mssdflt, \
     511             :         &tcp_rst_ppslim, \
     512             :         &tcp_ack_on_push, \
     513             :         NULL, \
     514             :         &tcp_syn_cache_limit, \
     515             :         &tcp_syn_bucket_limit, \
     516             :         &tcp_do_rfc3390, \
     517             :         NULL, \
     518             :         NULL, \
     519             :         NULL, \
     520             :         NULL, \
     521             :         NULL, \
     522             :         NULL, \
     523             :         NULL, \
     524             :         NULL \
     525             : }
     526             : 
     527             : struct tcp_ident_mapping {
     528             :         struct sockaddr_storage faddr, laddr;
     529             :         int euid, ruid;
     530             :         u_int rdomain;
     531             : };
     532             : 
     533             : #ifdef _KERNEL
     534             : 
     535             : #include <sys/percpu.h>
     536             : 
     537             : enum tcpstat_counters {
     538             :         tcps_connattempt,
     539             :         tcps_accepts,
     540             :         tcps_connects,
     541             :         tcps_drops,
     542             :         tcps_conndrops,
     543             :         tcps_closed,
     544             :         tcps_segstimed,
     545             :         tcps_rttupdated,
     546             :         tcps_delack,
     547             :         tcps_timeoutdrop,
     548             :         tcps_rexmttimeo,
     549             :         tcps_persisttimeo,
     550             :         tcps_persistdrop,
     551             :         tcps_keeptimeo,
     552             :         tcps_keepprobe,
     553             :         tcps_keepdrops,
     554             :         tcps_sndtotal,
     555             :         tcps_sndpack,
     556             :         tcps_sndbyte,
     557             :         tcps_sndrexmitpack,
     558             :         tcps_sndrexmitbyte,
     559             :         tcps_sndrexmitfast,
     560             :         tcps_sndacks,
     561             :         tcps_sndprobe,
     562             :         tcps_sndurg,
     563             :         tcps_sndwinup,
     564             :         tcps_sndctrl,
     565             :         tcps_rcvtotal,
     566             :         tcps_rcvpack,
     567             :         tcps_rcvbyte,
     568             :         tcps_rcvbadsum,
     569             :         tcps_rcvbadoff,
     570             :         tcps_rcvmemdrop,
     571             :         tcps_rcvnosec,
     572             :         tcps_rcvshort,
     573             :         tcps_rcvduppack,
     574             :         tcps_rcvdupbyte,
     575             :         tcps_rcvpartduppack,
     576             :         tcps_rcvpartdupbyte,
     577             :         tcps_rcvoopack,
     578             :         tcps_rcvoobyte,
     579             :         tcps_rcvpackafterwin,
     580             :         tcps_rcvbyteafterwin,
     581             :         tcps_rcvafterclose,
     582             :         tcps_rcvwinprobe,
     583             :         tcps_rcvdupack,
     584             :         tcps_rcvacktoomuch,
     585             :         tcps_rcvacktooold,
     586             :         tcps_rcvackpack,
     587             :         tcps_rcvackbyte,
     588             :         tcps_rcvwinupd,
     589             :         tcps_pawsdrop,
     590             :         tcps_predack,
     591             :         tcps_preddat,
     592             :         tcps_pcbhashmiss,
     593             :         tcps_noport,
     594             :         tcps_badsyn,
     595             :         tcps_dropsyn,
     596             :         tcps_rcvbadsig,
     597             :         tcps_rcvgoodsig,
     598             :         tcps_inswcsum,
     599             :         tcps_outswcsum,
     600             :         tcps_ecn_accepts,
     601             :         tcps_ecn_rcvece,
     602             :         tcps_ecn_rcvcwr,
     603             :         tcps_ecn_rcvce,
     604             :         tcps_ecn_sndect,
     605             :         tcps_ecn_sndece,
     606             :         tcps_ecn_sndcwr,
     607             :         tcps_cwr_ecn,
     608             :         tcps_cwr_frecovery,
     609             :         tcps_cwr_timeout,
     610             :         tcps_sc_added,
     611             :         tcps_sc_completed,
     612             :         tcps_sc_timed_out,
     613             :         tcps_sc_overflowed,
     614             :         tcps_sc_reset,
     615             :         tcps_sc_unreach,
     616             :         tcps_sc_bucketoverflow,
     617             :         tcps_sc_aborted,
     618             :         tcps_sc_dupesyn,
     619             :         tcps_sc_dropped,
     620             :         tcps_sc_collisions,
     621             :         tcps_sc_retransmitted,
     622             :         tcps_sc_seedrandom,
     623             :         tcps_sc_hash_size,
     624             :         tcps_sc_entry_count,
     625             :         tcps_sc_entry_limit,
     626             :         tcps_sc_bucket_maxlen,
     627             :         tcps_sc_bucket_limit,
     628             :         tcps_sc_uses_left,
     629             :         tcps_conndrained,
     630             :         tcps_sack_recovery_episode,
     631             :         tcps_sack_rexmits,
     632             :         tcps_sack_rexmit_bytes,
     633             :         tcps_sack_rcv_opts,
     634             :         tcps_sack_snd_opts,
     635             :         tcps_ncounters,
     636             : };
     637             : 
     638             : extern struct cpumem *tcpcounters;
     639             : 
     640             : static inline void
     641           0 : tcpstat_inc(enum tcpstat_counters c)
     642             : {
     643           0 :         counters_inc(tcpcounters, c);
     644           0 : }
     645             : 
     646             : static inline void
     647           0 : tcpstat_add(enum tcpstat_counters c, uint64_t v)
     648             : {
     649           0 :         counters_add(tcpcounters, c, v);
     650           0 : }
     651             : 
     652             : static inline void
     653           0 : tcpstat_pkt(enum tcpstat_counters pcounter, enum tcpstat_counters bcounter,
     654             :     uint64_t v)
     655             : {
     656           0 :         counters_pkt(tcpcounters, pcounter, bcounter, v);
     657           0 : }
     658             : 
     659             : extern  struct pool tcpcb_pool;
     660             : extern  struct inpcbtable tcbtable;     /* head of queue of active tcpcb's */
     661             : extern  u_int32_t tcp_now;              /* for RFC 1323 timestamps */
     662             : extern  int tcp_do_rfc1323;     /* enabled/disabled? */
     663             : extern  int tcptv_keep_init;    /* time to keep alive the initial SYN packet */
     664             : extern  int tcp_mssdflt;        /* default maximum segment size */
     665             : extern  int tcp_rst_ppslim;     /* maximum outgoing RST packet per second */
     666             : extern  int tcp_ack_on_push;    /* ACK immediately on PUSH */
     667             : extern  int tcp_do_sack;        /* SACK enabled/disabled */
     668             : extern  struct pool sackhl_pool;
     669             : extern  int tcp_sackhole_limit; /* max entries for tcp sack queues */
     670             : extern  int tcp_do_ecn;         /* RFC3168 ECN enabled/disabled? */
     671             : extern  int tcp_do_rfc3390;     /* RFC3390 Increasing TCP's Initial Window */
     672             : 
     673             : extern  struct pool tcpqe_pool;
     674             : extern  int tcp_reass_limit;    /* max entries for tcp reass queues */
     675             : 
     676             : extern  int tcp_syn_hash_size;  /* adjustable size of the hash array */
     677             : extern  int tcp_syn_cache_limit; /* max entries for compressed state engine */
     678             : extern  int tcp_syn_bucket_limit;/* max entries per hash bucket */
     679             : extern  int tcp_syn_use_limit;   /* number of uses before reseeding hash */
     680             : extern  struct syn_cache_set tcp_syn_cache[];
     681             : extern  int tcp_syn_cache_active; /* active syn cache, may be 0 or 1 */
     682             : 
     683             : void     tcp_canceltimers(struct tcpcb *);
     684             : struct tcpcb *
     685             :          tcp_close(struct tcpcb *);
     686             : int      tcp_freeq(struct tcpcb *);
     687             : #ifdef INET6
     688             : void     tcp6_ctlinput(int, struct sockaddr *, u_int, void *);
     689             : #endif
     690             : void     tcp_ctlinput(int, struct sockaddr *, u_int, void *);
     691             : int      tcp_ctloutput(int, struct socket *, int, int, struct mbuf *);
     692             : struct tcpcb *
     693             :          tcp_disconnect(struct tcpcb *);
     694             : struct tcpcb *
     695             :          tcp_drop(struct tcpcb *, int);
     696             : int      tcp_dooptions(struct tcpcb *, u_char *, int, struct tcphdr *,
     697             :                 struct mbuf *, int, struct tcp_opt_info *, u_int);
     698             : void     tcp_init(void);
     699             : int      tcp_input(struct mbuf **, int *, int, int);
     700             : int      tcp_mss(struct tcpcb *, int);
     701             : void     tcp_mss_update(struct tcpcb *);
     702             : u_int    tcp_hdrsz(struct tcpcb *);
     703             : void     tcp_mtudisc(struct inpcb *, int);
     704             : void     tcp_mtudisc_increase(struct inpcb *, int);
     705             : #ifdef INET6
     706             : void    tcp6_mtudisc(struct inpcb *, int);
     707             : void    tcp6_mtudisc_callback(struct sockaddr_in6 *, u_int);
     708             : #endif
     709             : struct tcpcb *
     710             :          tcp_newtcpcb(struct inpcb *);
     711             : void     tcp_notify(struct inpcb *, int);
     712             : int      tcp_output(struct tcpcb *);
     713             : void     tcp_pulloutofband(struct socket *, u_int, struct mbuf *, int);
     714             : int      tcp_reass(struct tcpcb *, struct tcphdr *, struct mbuf *, int *);
     715             : void     tcp_rscale(struct tcpcb *, u_long);
     716             : void     tcp_respond(struct tcpcb *, caddr_t, struct tcphdr *, tcp_seq,
     717             :                 tcp_seq, int, u_int);
     718             : void     tcp_setpersist(struct tcpcb *);
     719             : void     tcp_update_sndspace(struct tcpcb *);
     720             : void     tcp_update_rcvspace(struct tcpcb *);
     721             : void     tcp_slowtimo(void);
     722             : struct mbuf *
     723             :          tcp_template(struct tcpcb *);
     724             : void     tcp_trace(short, short, struct tcpcb *, struct tcpcb *, caddr_t,
     725             :                 int, int);
     726             : struct tcpcb *
     727             :          tcp_usrclosed(struct tcpcb *);
     728             : int      tcp_sysctl(int *, u_int, void *, size_t *, void *, size_t);
     729             : int      tcp_usrreq(struct socket *,
     730             :             int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *);
     731             : int      tcp_attach(struct socket *, int);
     732             : int      tcp_detach(struct socket *);
     733             : void     tcp_xmit_timer(struct tcpcb *, int);
     734             : void     tcpdropoldhalfopen(struct tcpcb *, u_int16_t);
     735             : void     tcp_sack_option(struct tcpcb *,struct tcphdr *,u_char *,int);
     736             : void     tcp_update_sack_list(struct tcpcb *tp, tcp_seq, tcp_seq);
     737             : void     tcp_del_sackholes(struct tcpcb *, struct tcphdr *);
     738             : void     tcp_clean_sackreport(struct tcpcb *tp);
     739             : void     tcp_sack_adjust(struct tcpcb *tp);
     740             : struct sackhole *
     741             :          tcp_sack_output(struct tcpcb *tp);
     742             : #ifdef DEBUG
     743             : void     tcp_print_holes(struct tcpcb *tp);
     744             : #endif
     745             : u_long   tcp_seq_subtract(u_long, u_long );
     746             : #ifdef TCP_SIGNATURE
     747             : int     tcp_signature_apply(caddr_t, caddr_t, unsigned int);
     748             : int     tcp_signature(struct tdb *, int, struct mbuf *, struct tcphdr *,
     749             :             int, int, char *);
     750             : #endif /* TCP_SIGNATURE */
     751             : void     tcp_set_iss_tsm(struct tcpcb *);
     752             : 
     753             : void     syn_cache_unreach(struct sockaddr *, struct sockaddr *,
     754             :            struct tcphdr *, u_int);
     755             : void     syn_cache_init(void);
     756             : void     syn_cache_cleanup(struct tcpcb *);
     757             : 
     758             : #endif /* _KERNEL */
     759             : #endif /* _NETINET_TCP_VAR_H_ */

Generated by: LCOV version 1.13