root/netinet/tcp_var.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. tcp_reass_lock_try
  2. tcp_reass_unlock

    1 /*      $OpenBSD: tcp_var.h,v 1.83 2007/06/25 12:17:43 markus 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 /*
   39  * Kernel variables for tcp.
   40  */
   41 
   42 struct sackblk {
   43         tcp_seq start;          /* start seq no. of sack block */
   44         tcp_seq end;            /* end seq no. */
   45 };
   46 
   47 struct sackhole {
   48         tcp_seq start;          /* start seq no. of hole */
   49         tcp_seq end;            /* end seq no. */
   50         int     dups;           /* number of dup(s)acks for this hole */
   51         tcp_seq rxmit;          /* next seq. no in hole to be retransmitted */
   52         struct sackhole *next;  /* next in list */
   53 };
   54 
   55 /*
   56  * TCP sequence queue structures.
   57  */
   58 TAILQ_HEAD(tcpqehead, tcpqent);
   59 struct tcpqent {
   60         TAILQ_ENTRY(tcpqent) tcpqe_q;
   61         struct tcphdr   *tcpqe_tcp;
   62         struct mbuf     *tcpqe_m;       /* mbuf contains packet */
   63 };
   64 
   65 /*
   66  * Tcp control block, one per tcp; fields:
   67  */
   68 struct tcpcb {
   69         struct tcpqehead t_segq;                /* sequencing queue */
   70         struct timeout t_timer[TCPT_NTIMERS];   /* tcp timers */
   71         short   t_state;                /* state of this connection */
   72         short   t_rxtshift;             /* log(2) of rexmt exp. backoff */
   73         short   t_rxtcur;               /* current retransmit value */
   74         short   t_dupacks;              /* consecutive dup acks recd */
   75         u_short t_maxseg;               /* maximum segment size */
   76         char    t_force;                /* 1 if forcing out a byte */
   77         u_int   t_flags;
   78 #define TF_ACKNOW       0x0001          /* ack peer immediately */
   79 #define TF_DELACK       0x0002          /* ack, but try to delay it */
   80 #define TF_NODELAY      0x0004          /* don't delay packets to coalesce */
   81 #define TF_NOOPT        0x0008          /* don't use tcp options */
   82 #define TF_SENTFIN      0x0010          /* have sent FIN */
   83 #define TF_REQ_SCALE    0x0020          /* have/will request window scaling */
   84 #define TF_RCVD_SCALE   0x0040          /* other side has requested scaling */
   85 #define TF_REQ_TSTMP    0x0080          /* have/will request timestamps */
   86 #define TF_RCVD_TSTMP   0x0100          /* a timestamp was received in SYN */
   87 #define TF_SACK_PERMIT  0x0200          /* other side said I could SACK */
   88 #define TF_SIGNATURE    0x0400          /* require TCP MD5 signature */
   89 #ifdef TCP_ECN
   90 #define TF_ECN_PERMIT   0x00008000      /* other side said I could ECN */
   91 #define TF_RCVD_CE      0x00010000      /* send ECE in subsequent segs */
   92 #define TF_SEND_CWR     0x00020000      /* send CWR in next seg */
   93 #define TF_DISABLE_ECN  0x00040000      /* disable ECN for this connection */
   94 #endif
   95 #define TF_REASSLOCK    0x00080000      /* reassembling or draining */
   96 #define TF_LASTIDLE     0x00100000      /* no outstanding ACK on last send */
   97 #define TF_DEAD         0x00200000      /* dead and to-be-released */
   98 #define TF_PMTUD_PEND   0x00400000      /* Path MTU Discovery pending */
   99 
  100         struct  mbuf *t_template;       /* skeletal packet for transmit */
  101         struct  inpcb *t_inpcb;         /* back pointer to internet pcb */
  102         struct  timeout t_delack_to;    /* delayed ACK callback */
  103 /*
  104  * The following fields are used as in the protocol specification.
  105  * See RFC793, Dec. 1981, page 21.
  106  */
  107 /* send sequence variables */
  108         tcp_seq snd_una;                /* send unacknowledged */
  109         tcp_seq snd_nxt;                /* send next */
  110         tcp_seq snd_up;                 /* send urgent pointer */
  111         tcp_seq snd_wl1;                /* window update seg seq number */
  112         tcp_seq snd_wl2;                /* window update seg ack number */
  113         tcp_seq iss;                    /* initial send sequence number */
  114         u_long  snd_wnd;                /* send window */
  115 #if 1 /*def TCP_SACK*/
  116         int     sack_enable;            /* enable SACK for this connection */
  117         int     snd_numholes;           /* number of holes seen by sender */
  118         struct sackhole *snd_holes;     /* linked list of holes (sorted) */
  119 #if 1 /*defined(TCP_SACK) && defined(TCP_FACK)*/
  120         tcp_seq snd_fack;               /* for FACK congestion control */
  121         u_long  snd_awnd;               /* snd_nxt - snd_fack + */
  122                                         /* retransmitted data */
  123         int retran_data;                /* amount of outstanding retx. data  */
  124 #endif /* TCP_FACK */
  125 #endif /* TCP_SACK */
  126 #if 1 /*defined(TCP_SACK) || defined(TCP_ECN)*/
  127         tcp_seq snd_last;               /* for use in fast recovery */
  128 #endif
  129 /* receive sequence variables */
  130         u_long  rcv_wnd;                /* receive window */
  131         tcp_seq rcv_nxt;                /* receive next */
  132         tcp_seq rcv_up;                 /* receive urgent pointer */
  133         tcp_seq irs;                    /* initial receive sequence number */
  134 #if 1 /*def TCP_SACK*/
  135         tcp_seq rcv_lastsack;           /* last seq number(+1) sack'd by rcv'r*/
  136         int     rcv_numsacks;           /* # distinct sack blks present */
  137         struct sackblk sackblks[MAX_SACK_BLKS]; /* seq nos. of sack blocks */
  138 #endif
  139 
  140 /*
  141  * Additional variables for this implementation.
  142  */
  143 /* receive variables */
  144         tcp_seq rcv_adv;                /* advertised window */
  145 /* retransmit variables */
  146         tcp_seq snd_max;                /* highest sequence number sent;
  147                                          * used to recognize retransmits
  148                                          */
  149 /* congestion control (for slow start, source quench, retransmit after loss) */
  150         u_long  snd_cwnd;               /* congestion-controlled window */
  151         u_long  snd_ssthresh;           /* snd_cwnd size threshold for
  152                                          * for slow start exponential to
  153                                          * linear switch
  154                                          */
  155         u_short t_maxopd;               /* mss plus options */
  156         u_short t_peermss;              /* peer's maximum segment size */
  157 
  158 /*
  159  * transmit timing stuff.  See below for scale of srtt and rttvar.
  160  * "Variance" is actually smoothed difference.
  161  */
  162         uint32_t t_rcvtime;             /* time last segment received */
  163         uint32_t t_rtttime;             /* time we started measuring rtt */
  164         tcp_seq t_rtseq;                /* sequence number being timed */
  165         short   t_srtt;                 /* smoothed round-trip time */
  166         short   t_rttvar;               /* variance in round-trip time */
  167         u_short t_rttmin;               /* minimum rtt allowed */
  168         u_long  max_sndwnd;             /* largest window peer has offered */
  169 
  170 /* out-of-band data */
  171         char    t_oobflags;             /* have some */
  172         char    t_iobc;                 /* input character */
  173 #define TCPOOB_HAVEDATA 0x01
  174 #define TCPOOB_HADDATA  0x02
  175         short   t_softerror;            /* possible error not yet reported */
  176 
  177 /* RFC 1323 variables */
  178         u_char  snd_scale;              /* window scaling for send window */
  179         u_char  rcv_scale;              /* window scaling for recv window */
  180         u_char  request_r_scale;        /* pending window scaling */
  181         u_char  requested_s_scale;
  182         u_int32_t ts_recent;            /* timestamp echo data */
  183         u_int32_t ts_modulate;          /* modulation on timestamp */
  184         u_int32_t ts_recent_age;                /* when last updated */
  185         tcp_seq last_ack_sent;
  186 
  187 /* pointer for syn cache entries*/
  188         LIST_HEAD(, syn_cache) t_sc;    /* list of entries by this tcb */
  189 
  190 /* Path-MTU Discovery Information */
  191         u_int   t_pmtud_mss_acked;      /* MSS acked, lower bound for MTU */
  192         u_int   t_pmtud_mtu_sent;       /* MTU used, upper bound for MTU */
  193         tcp_seq t_pmtud_th_seq;         /* TCP SEQ from ICMP payload */
  194         u_int   t_pmtud_nextmtu;        /* Advertised Next-Hop MTU from ICMP */
  195         u_short t_pmtud_ip_len;         /* IP length from ICMP payload */
  196         u_short t_pmtud_ip_hl;          /* IP header length from ICMP payload */
  197 
  198         int pf;
  199 
  200         struct  timeout t_reap_to;      /* delayed cleanup timeout */
  201 };
  202 
  203 #define intotcpcb(ip)   ((struct tcpcb *)(ip)->inp_ppcb)
  204 #define sototcpcb(so)   (intotcpcb(sotoinpcb(so)))
  205 
  206 #ifdef _KERNEL
  207 extern int tcp_delack_ticks;
  208 void    tcp_delack(void *);
  209 
  210 #define TCP_INIT_DELACK(tp)                                             \
  211         timeout_set(&(tp)->t_delack_to, tcp_delack, tp)
  212 
  213 #define TCP_RESTART_DELACK(tp)                                          \
  214         timeout_add(&(tp)->t_delack_to, tcp_delack_ticks)
  215 
  216 #define TCP_SET_DELACK(tp)                                              \
  217 do {                                                                    \
  218         if (((tp)->t_flags & TF_DELACK) == 0) {                         \
  219                 (tp)->t_flags |= TF_DELACK;                             \
  220                 TCP_RESTART_DELACK(tp);                                 \
  221         }                                                               \
  222 } while (/*CONSTCOND*/0)
  223 
  224 #define TCP_CLEAR_DELACK(tp)                                            \
  225 do {                                                                    \
  226         if ((tp)->t_flags & TF_DELACK) {                                \
  227                 (tp)->t_flags &= ~TF_DELACK;                            \
  228                 timeout_del(&(tp)->t_delack_to);                        \
  229         }                                                               \
  230 } while (/*CONSTCOND*/0)
  231 
  232 /*
  233  * Handy way of passing around TCP option info.
  234  */
  235 struct tcp_opt_info {
  236         int             ts_present;
  237         u_int32_t       ts_val;
  238         u_int32_t       ts_ecr;
  239         u_int16_t       maxseg;
  240 };
  241 
  242 /*
  243  * Data for the TCP compressed state engine.
  244  */
  245 union syn_cache_sa {
  246         struct sockaddr sa;
  247         struct sockaddr_in sin;
  248 #if 1 /*def INET6*/
  249         struct sockaddr_in6 sin6;
  250 #endif
  251 };
  252 
  253 struct syn_cache {
  254         TAILQ_ENTRY(syn_cache) sc_bucketq;      /* link on bucket list */
  255         struct timeout sc_timer;                /* rexmt timer */
  256         union {                                 /* cached route */
  257                 struct route route4;
  258 #ifdef INET6
  259                 struct route_in6 route6;
  260 #endif
  261         } sc_route_u;
  262 #define sc_route4       sc_route_u.route4
  263 #ifdef INET6
  264 #define sc_route6       sc_route_u.route6
  265 #endif
  266         long sc_win;                            /* advertised window */
  267         int sc_bucketidx;                       /* our bucket index */
  268         u_int32_t sc_hash;
  269         u_int32_t sc_timestamp;                 /* timestamp from SYN */
  270         u_int32_t sc_modulate;                  /* our timestamp modulator */
  271 #if 0
  272         u_int32_t sc_timebase;                  /* our local timebase */
  273 #endif
  274         union syn_cache_sa sc_src;
  275         union syn_cache_sa sc_dst;
  276         tcp_seq sc_irs;
  277         tcp_seq sc_iss;
  278         u_int sc_rxtcur;                        /* current rxt timeout */
  279         u_int sc_rxttot;                        /* total time spend on queues */
  280         u_short sc_rxtshift;                    /* for computing backoff */
  281         u_short sc_flags;
  282 
  283 #define SCF_UNREACH             0x0001          /* we've had an unreach error */
  284 #define SCF_TIMESTAMP           0x0002          /* peer will do timestamps */
  285 #define SCF_DEAD                0x0004          /* this entry to be released */
  286 #define SCF_SACK_PERMIT         0x0008          /* permit sack */
  287 #define SCF_ECN_PERMIT          0x0010          /* permit ecn */
  288 #define SCF_SIGNATURE           0x0020          /* enforce tcp signatures */
  289 
  290         struct mbuf *sc_ipopts;                 /* IP options */
  291         u_int16_t sc_peermaxseg;
  292         u_int16_t sc_ourmaxseg;
  293         u_int     sc_request_r_scale    : 4,
  294                   sc_requested_s_scale  : 4;
  295 
  296         struct tcpcb *sc_tp;                    /* tcb for listening socket */
  297         LIST_ENTRY(syn_cache) sc_tpq;           /* list of entries by same tp */
  298 };
  299 
  300 struct syn_cache_head {
  301         TAILQ_HEAD(, syn_cache) sch_bucket;     /* bucket entries */
  302         u_short sch_length;                     /* # entries in bucket */
  303 };
  304 
  305 static __inline int tcp_reass_lock_try(struct tcpcb *);
  306 static __inline void tcp_reass_unlock(struct tcpcb *);
  307 #define tcp_reass_lock(tp) tcp_reass_lock_try(tp)
  308 
  309 static __inline int
  310 tcp_reass_lock_try(struct tcpcb *tp)
  311 {
  312         int s;
  313 
  314         /* Use splvm() due to mbuf allocation. */
  315         s = splvm();
  316         if (tp->t_flags & TF_REASSLOCK) {
  317                 splx(s);
  318                 return (0);
  319         }
  320         tp->t_flags |= TF_REASSLOCK;
  321         splx(s);
  322         return (1);
  323 }
  324 
  325 static __inline void
  326 tcp_reass_unlock(struct tcpcb *tp)
  327 {
  328         int s;
  329 
  330         s = splvm();
  331         tp->t_flags &= ~TF_REASSLOCK;
  332         splx(s);
  333 }
  334 #endif /* _KERNEL */
  335 
  336 /*
  337  * The smoothed round-trip time and estimated variance
  338  * are stored as fixed point numbers scaled by the values below.
  339  * For convenience, these scales are also used in smoothing the average
  340  * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed).
  341  * With these scales, srtt has 5 bits to the right of the binary point,
  342  * and thus an "ALPHA" of 0.875.  rttvar has 4 bits to the right of the
  343  * binary point, and is smoothed with an ALPHA of 0.75.
  344  */
  345 #define TCP_RTT_SHIFT           3       /* shift for srtt; 5 bits frac. */
  346 #define TCP_RTTVAR_SHIFT        2       /* shift for rttvar; 4 bits */
  347 #define TCP_RTT_BASE_SHIFT      2       /* remaining 2 bit shift */
  348 #define TCP_RTT_MAX             (1<<9)  /* maximum rtt */
  349 
  350 /*
  351  * The initial retransmission should happen at rtt + 4 * rttvar.
  352  * Because of the way we do the smoothing, srtt and rttvar
  353  * will each average +1/2 tick of bias.  When we compute
  354  * the retransmit timer, we want 1/2 tick of rounding and
  355  * 1 extra tick because of +-1/2 tick uncertainty in the
  356  * firing of the timer.  The bias will give us exactly the
  357  * 1.5 tick we need.  But, because the bias is
  358  * statistical, we have to test that we don't drop below
  359  * the minimum feasible timer (which is 2 ticks).
  360  * This macro assumes that the value of (1 << TCP_RTTVAR_SHIFT)
  361  * is the same as the multiplier for rttvar.
  362  */
  363 #define TCP_REXMTVAL(tp) \
  364         ((((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) >> TCP_RTT_BASE_SHIFT)
  365 
  366 /*
  367  * TCP statistics.
  368  * Many of these should be kept per connection,
  369  * but that's inconvenient at the moment.
  370  */
  371 struct  tcpstat {
  372         u_int32_t tcps_connattempt;     /* connections initiated */
  373         u_int32_t tcps_accepts;         /* connections accepted */
  374         u_int32_t tcps_connects;        /* connections established */
  375         u_int32_t tcps_drops;           /* connections dropped */
  376         u_int32_t tcps_conndrops;       /* embryonic connections dropped */
  377         u_int32_t tcps_closed;          /* conn. closed (includes drops) */
  378         u_int32_t tcps_segstimed;       /* segs where we tried to get rtt */
  379         u_int32_t tcps_rttupdated;      /* times we succeeded */
  380         u_int32_t tcps_delack;          /* delayed acks sent */
  381         u_int32_t tcps_timeoutdrop;     /* conn. dropped in rxmt timeout */
  382         u_int32_t tcps_rexmttimeo;      /* retransmit timeouts */
  383         u_int32_t tcps_persisttimeo;    /* persist timeouts */
  384         u_int32_t tcps_persistdrop;     /* connections dropped in persist */
  385         u_int32_t tcps_keeptimeo;       /* keepalive timeouts */
  386         u_int32_t tcps_keepprobe;       /* keepalive probes sent */
  387         u_int32_t tcps_keepdrops;       /* connections dropped in keepalive */
  388 
  389         u_int32_t tcps_sndtotal;                /* total packets sent */
  390         u_int32_t tcps_sndpack;         /* data packets sent */
  391         u_int64_t tcps_sndbyte;         /* data bytes sent */
  392         u_int32_t tcps_sndrexmitpack;   /* data packets retransmitted */
  393         u_int64_t tcps_sndrexmitbyte;   /* data bytes retransmitted */
  394         u_int64_t tcps_sndrexmitfast;   /* Fast retransmits */
  395         u_int32_t tcps_sndacks;         /* ack-only packets sent */
  396         u_int32_t tcps_sndprobe;        /* window probes sent */
  397         u_int32_t tcps_sndurg;          /* packets sent with URG only */
  398         u_int32_t tcps_sndwinup;        /* window update-only packets sent */
  399         u_int32_t tcps_sndctrl;         /* control (SYN|FIN|RST) packets sent */
  400 
  401         u_int32_t tcps_rcvtotal;        /* total packets received */
  402         u_int32_t tcps_rcvpack;         /* packets received in sequence */
  403         u_int64_t tcps_rcvbyte;         /* bytes received in sequence */
  404         u_int32_t tcps_rcvbadsum;       /* packets received with ccksum errs */
  405         u_int32_t tcps_rcvbadoff;       /* packets received with bad offset */
  406         u_int32_t tcps_rcvmemdrop;      /* packets dropped for lack of memory */
  407         u_int32_t tcps_rcvnosec;        /* packets dropped for lack of ipsec */
  408         u_int32_t tcps_rcvshort;        /* packets received too short */
  409         u_int32_t tcps_rcvduppack;      /* duplicate-only packets received */
  410         u_int64_t tcps_rcvdupbyte;      /* duplicate-only bytes received */
  411         u_int32_t tcps_rcvpartduppack;  /* packets with some duplicate data */
  412         u_int64_t tcps_rcvpartdupbyte;  /* dup. bytes in part-dup. packets */
  413         u_int32_t tcps_rcvoopack;       /* out-of-order packets received */
  414         u_int64_t tcps_rcvoobyte;       /* out-of-order bytes received */
  415         u_int32_t tcps_rcvpackafterwin; /* packets with data after window */
  416         u_int64_t tcps_rcvbyteafterwin; /* bytes rcvd after window */
  417         u_int32_t tcps_rcvafterclose;   /* packets rcvd after "close" */
  418         u_int32_t tcps_rcvwinprobe;     /* rcvd window probe packets */
  419         u_int32_t tcps_rcvdupack;       /* rcvd duplicate acks */
  420         u_int32_t tcps_rcvacktoomuch;   /* rcvd acks for unsent data */
  421         u_int32_t tcps_rcvacktooold;    /* rcvd acks for old data */
  422         u_int32_t tcps_rcvackpack;      /* rcvd ack packets */
  423         u_int64_t tcps_rcvackbyte;      /* bytes acked by rcvd acks */
  424         u_int32_t tcps_rcvwinupd;       /* rcvd window update packets */
  425         u_int32_t tcps_pawsdrop;        /* segments dropped due to PAWS */
  426         u_int32_t tcps_predack;         /* times hdr predict ok for acks */
  427         u_int32_t tcps_preddat;         /* times hdr predict ok for data pkts */
  428 
  429         u_int32_t tcps_pcbhashmiss;     /* input packets missing pcb hash */
  430         u_int32_t tcps_noport;          /* no socket on port */
  431         u_int32_t tcps_badsyn;          /* SYN packet with src==dst rcv'ed */
  432 
  433         u_int32_t tcps_rcvbadsig;       /* rcvd bad/missing TCP signatures */
  434         u_int64_t tcps_rcvgoodsig;      /* rcvd good TCP signatures */
  435         u_int32_t tcps_inhwcsum;        /* input hardware-checksummed packets */
  436         u_int32_t tcps_outhwcsum;       /* output hardware-checksummed packets */
  437 
  438         /* ECN stats */
  439         u_int32_t tcps_ecn_accepts;     /* ecn connections accepted */
  440         u_int32_t tcps_ecn_rcvece;      /* # of rcvd ece */
  441         u_int32_t tcps_ecn_rcvcwr;      /* # of rcvd cwr */
  442         u_int32_t tcps_ecn_rcvce;       /* # of rcvd ce in ip header */
  443         u_int32_t tcps_ecn_sndect;      /* # of cwr sent */
  444         u_int32_t tcps_ecn_sndece;      /* # of ece sent */
  445         u_int32_t tcps_ecn_sndcwr;      /* # of cwr sent */
  446         u_int32_t tcps_cwr_ecn;         /* # of cwnd reduced by ecn */
  447         u_int32_t tcps_cwr_frecovery;   /* # of cwnd reduced by fastrecovery */
  448         u_int32_t tcps_cwr_timeout;     /* # of cwnd reduced by timeout */
  449 
  450         /* These statistics deal with the SYN cache. */
  451         u_int64_t tcps_sc_added;        /* # of entries added */
  452         u_int64_t tcps_sc_completed;    /* # of connections completed */
  453         u_int64_t tcps_sc_timed_out;    /* # of entries timed out */
  454         u_int64_t tcps_sc_overflowed;   /* # dropped due to overflow */
  455         u_int64_t tcps_sc_reset;        /* # dropped due to RST */
  456         u_int64_t tcps_sc_unreach;      /* # dropped due to ICMP unreach */
  457         u_int64_t tcps_sc_bucketoverflow;/* # dropped due to bucket overflow */
  458         u_int64_t tcps_sc_aborted;      /* # of entries aborted (no mem) */
  459         u_int64_t tcps_sc_dupesyn;      /* # of duplicate SYNs received */
  460         u_int64_t tcps_sc_dropped;      /* # of SYNs dropped (no route/mem) */
  461         u_int64_t tcps_sc_collisions;   /* # of hash collisions */
  462         u_int64_t tcps_sc_retransmitted;/* # of retransmissions */
  463 
  464         u_int64_t tcps_conndrained;     /* # of connections drained */
  465 
  466         u_int64_t tcps_sack_recovery_episode;   /* SACK recovery episodes */
  467         u_int64_t tcps_sack_rexmits;            /* SACK rexmit segments */
  468         u_int64_t tcps_sack_rexmit_bytes;       /* SACK rexmit bytes */
  469         u_int64_t tcps_sack_rcv_opts;           /* SACK options received */
  470         u_int64_t tcps_sack_snd_opts;           /* SACK options sent */
  471 };
  472 
  473 /*
  474  * Names for TCP sysctl objects.
  475  */
  476 
  477 #define TCPCTL_RFC1323          1 /* enable/disable RFC1323 timestamps/scaling */
  478 #define TCPCTL_KEEPINITTIME     2 /* TCPT_KEEP value */
  479 #define TCPCTL_KEEPIDLE         3 /* allow tcp_keepidle to be changed */
  480 #define TCPCTL_KEEPINTVL        4 /* allow tcp_keepintvl to be changed */
  481 #define TCPCTL_SLOWHZ           5 /* return kernel idea of PR_SLOWHZ */
  482 #define TCPCTL_BADDYNAMIC       6 /* return bad dynamic port bitmap */
  483 #define TCPCTL_RECVSPACE        7 /* receive buffer space */
  484 #define TCPCTL_SENDSPACE        8 /* send buffer space */
  485 #define TCPCTL_IDENT            9 /* get connection owner */
  486 #define TCPCTL_SACK            10 /* selective acknowledgement, rfc 2018 */
  487 #define TCPCTL_MSSDFLT         11 /* Default maximum segment size */
  488 #define TCPCTL_RSTPPSLIMIT     12 /* RST pps limit */
  489 #define TCPCTL_ACK_ON_PUSH     13 /* ACK immediately on PUSH */
  490 #define TCPCTL_ECN             14 /* RFC3168 ECN */
  491 #define TCPCTL_SYN_CACHE_LIMIT 15 /* max size of comp. state engine */
  492 #define TCPCTL_SYN_BUCKET_LIMIT 16 /* max size of hash bucket */
  493 #define TCPCTL_RFC3390         17 /* enable/disable RFC3390 increased cwnd */
  494 #define TCPCTL_REASS_LIMIT     18 /* max entries for tcp reass queues */
  495 #define TCPCTL_DROP            19 /* drop tcp connection */
  496 #define TCPCTL_SACKHOLE_LIMIT  20 /* max entries for tcp sack queues */
  497 #define TCPCTL_MAXID           21
  498 
  499 #define TCPCTL_NAMES { \
  500         { 0, 0 }, \
  501         { "rfc1323",    CTLTYPE_INT }, \
  502         { "keepinittime",       CTLTYPE_INT }, \
  503         { "keepidle",   CTLTYPE_INT }, \
  504         { "keepintvl",  CTLTYPE_INT }, \
  505         { "slowhz",     CTLTYPE_INT }, \
  506         { "baddynamic", CTLTYPE_STRUCT }, \
  507         { "recvspace",  CTLTYPE_INT }, \
  508         { "sendspace",  CTLTYPE_INT }, \
  509         { "ident",      CTLTYPE_STRUCT }, \
  510         { "sack",       CTLTYPE_INT }, \
  511         { "mssdflt",    CTLTYPE_INT }, \
  512         { "rstppslimit",        CTLTYPE_INT }, \
  513         { "ackonpush",  CTLTYPE_INT }, \
  514         { "ecn",        CTLTYPE_INT }, \
  515         { "syncachelimit",      CTLTYPE_INT }, \
  516         { "synbucketlimit",     CTLTYPE_INT }, \
  517         { "rfc3390",    CTLTYPE_INT }, \
  518         { "reasslimit",         CTLTYPE_INT }, \
  519         { "drop",       CTLTYPE_STRUCT }, \
  520         { "sackholelimit",      CTLTYPE_INT }, \
  521 }
  522 
  523 #define TCPCTL_VARS { \
  524         NULL, \
  525         &tcp_do_rfc1323, \
  526         &tcptv_keep_init, \
  527         &tcp_keepidle, \
  528         &tcp_keepintvl, \
  529         NULL, \
  530         NULL, \
  531         &tcp_recvspace, \
  532         &tcp_sendspace, \
  533         NULL, \
  534         NULL, \
  535         &tcp_mssdflt, \
  536         &tcp_rst_ppslim, \
  537         &tcp_ack_on_push, \
  538         NULL, \
  539         &tcp_syn_cache_limit, \
  540         &tcp_syn_bucket_limit, \
  541         &tcp_do_rfc3390, \
  542         NULL, \
  543         NULL, \
  544         NULL \
  545 }
  546 
  547 struct tcp_ident_mapping {
  548         struct sockaddr_storage faddr, laddr;
  549         int euid, ruid;
  550 };
  551 
  552 #ifdef _KERNEL
  553 extern  struct inpcbtable tcbtable;     /* head of queue of active tcpcb's */
  554 extern  struct tcpstat tcpstat; /* tcp statistics */
  555 extern  u_int32_t tcp_now;              /* for RFC 1323 timestamps */
  556 extern  int tcp_do_rfc1323;     /* enabled/disabled? */
  557 extern  int tcp_mssdflt;        /* default maximum segment size */
  558 extern  int tcp_ack_on_push;    /* ACK immediately on PUSH */
  559 #ifdef TCP_SACK
  560 extern  int tcp_do_sack;        /* SACK enabled/disabled */
  561 extern  struct pool sackhl_pool;
  562 extern  int tcp_sackhole_limit; /* max entries for tcp sack queues */
  563 #endif
  564 extern  int tcp_do_ecn;         /* RFC3168 ECN enabled/disabled? */
  565 extern  int tcp_do_rfc3390;     /* RFC3390 Increasing TCP's Initial Window */
  566 
  567 extern  struct pool tcpqe_pool;
  568 extern  int tcp_reass_limit;    /* max entries for tcp reass queues */
  569 
  570 extern  int tcp_syn_cache_limit; /* max entries for compressed state engine */
  571 extern  int tcp_syn_bucket_limit;/* max entries per hash bucket */
  572 
  573 extern  int tcp_syn_cache_size;
  574 extern  struct syn_cache_head tcp_syn_cache[];
  575 extern  u_long syn_cache_count;
  576 
  577 int      tcp_attach(struct socket *);
  578 void     tcp_canceltimers(struct tcpcb *);
  579 struct tcpcb *
  580          tcp_close(struct tcpcb *);
  581 void     tcp_reaper(void *);
  582 int      tcp_freeq(struct tcpcb *);
  583 #if defined(INET6) && !defined(TCP6)
  584 void     tcp6_ctlinput(int, struct sockaddr *, void *);
  585 #endif
  586 void     *tcp_ctlinput(int, struct sockaddr *, void *);
  587 int      tcp_ctloutput(int, struct socket *, int, int, struct mbuf **);
  588 struct tcpcb *
  589          tcp_disconnect(struct tcpcb *);
  590 struct tcpcb *
  591          tcp_drop(struct tcpcb *, int);
  592 int      tcp_dooptions(struct tcpcb *, u_char *, int, struct tcphdr *,
  593                 struct mbuf *, int, struct tcp_opt_info *);
  594 void     tcp_drain(void);
  595 void     tcp_init(void);
  596 #if defined(INET6) && !defined(TCP6)
  597 int      tcp6_input(struct mbuf **, int *, int);
  598 #endif
  599 void     tcp_input(struct mbuf *, ...);
  600 int      tcp_mss(struct tcpcb *, int);
  601 void     tcp_mss_update(struct tcpcb *);
  602 u_int    tcp_hdrsz(struct tcpcb *);
  603 void     tcp_mtudisc(struct inpcb *, int);
  604 void     tcp_mtudisc_increase(struct inpcb *, int);
  605 #ifdef INET6
  606 void    tcp6_mtudisc(struct inpcb *, int);
  607 void    tcp6_mtudisc_callback(struct in6_addr *);
  608 #endif
  609 struct tcpcb *
  610          tcp_newtcpcb(struct inpcb *);
  611 void     tcp_notify(struct inpcb *, int);
  612 int      tcp_output(struct tcpcb *);
  613 void     tcp_pulloutofband(struct socket *, u_int, struct mbuf *, int);
  614 int      tcp_reass(struct tcpcb *, struct tcphdr *, struct mbuf *, int *);
  615 void     tcp_rscale(struct tcpcb *, u_long);
  616 void     tcp_respond(struct tcpcb *, caddr_t, struct mbuf *, tcp_seq,
  617                 tcp_seq, int);
  618 void     tcp_setpersist(struct tcpcb *);
  619 void     tcp_slowtimo(void);
  620 struct mbuf *
  621          tcp_template(struct tcpcb *);
  622 void     tcp_trace(short, short, struct tcpcb *, caddr_t, int, int);
  623 struct tcpcb *
  624          tcp_usrclosed(struct tcpcb *);
  625 int      tcp_sysctl(int *, u_int, void *, size_t *, void *, size_t);
  626 #if defined(INET6) && !defined(TCP6)
  627 int      tcp6_usrreq(struct socket *,
  628             int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *);
  629 #endif
  630 int      tcp_usrreq(struct socket *,
  631             int, struct mbuf *, struct mbuf *, struct mbuf *);
  632 void     tcp_xmit_timer(struct tcpcb *, int);
  633 void     tcpdropoldhalfopen(struct tcpcb *, u_int16_t);
  634 #ifdef TCP_SACK
  635 void     tcp_sack_option(struct tcpcb *,struct tcphdr *,u_char *,int);
  636 void     tcp_update_sack_list(struct tcpcb *tp, tcp_seq, tcp_seq);
  637 void     tcp_del_sackholes(struct tcpcb *, struct tcphdr *);
  638 void     tcp_clean_sackreport(struct tcpcb *tp);
  639 void     tcp_sack_adjust(struct tcpcb *tp);
  640 struct sackhole *
  641          tcp_sack_output(struct tcpcb *tp);
  642 int      tcp_sack_partialack(struct tcpcb *, struct tcphdr *);
  643 #ifdef DEBUG
  644 void     tcp_print_holes(struct tcpcb *tp);
  645 #endif
  646 #endif /* TCP_SACK */
  647 #if defined(TCP_SACK)
  648 int      tcp_newreno(struct tcpcb *, struct tcphdr *);
  649 u_long   tcp_seq_subtract(u_long, u_long );
  650 #endif /* TCP_SACK */
  651 #ifdef TCP_SIGNATURE
  652 int     tcp_signature_apply(caddr_t, caddr_t, unsigned int);
  653 int     tcp_signature(struct tdb *, int, struct mbuf *, struct tcphdr *,
  654             int, int, char *);
  655 #endif /* TCP_SIGNATURE */
  656 void    tcp_rndiss_init(void);
  657 tcp_seq tcp_rndiss_next(void);
  658 u_int16_t
  659         tcp_rndiss_encrypt(u_int16_t);
  660 void     tcp_set_iss_tsm(struct tcpcb *);
  661 
  662 int      syn_cache_add(struct sockaddr *, struct sockaddr *,
  663                 struct tcphdr *, unsigned int, struct socket *,
  664                 struct mbuf *, u_char *, int, struct tcp_opt_info *, tcp_seq *);
  665 void     syn_cache_unreach(struct sockaddr *, struct sockaddr *,
  666            struct tcphdr *);
  667 struct socket *syn_cache_get(struct sockaddr *, struct sockaddr *,
  668                 struct tcphdr *, unsigned int, unsigned int,
  669                 struct socket *so, struct mbuf *);
  670 void     syn_cache_init(void);
  671 void     syn_cache_insert(struct syn_cache *, struct tcpcb *);
  672 struct syn_cache *syn_cache_lookup(struct sockaddr *, struct sockaddr *,
  673                 struct syn_cache_head **);
  674 void     syn_cache_reset(struct sockaddr *, struct sockaddr *,
  675                 struct tcphdr *);
  676 int      syn_cache_respond(struct syn_cache *, struct mbuf *);
  677 void     syn_cache_timer(void *);
  678 void     syn_cache_cleanup(struct tcpcb *);
  679 void     syn_cache_reaper(void *);
  680 
  681 #endif /* _KERNEL */
  682 #endif /* _NETINET_TCP_VAR_H_ */

/* [<][>][^][v][top][bottom][index][help] */