[BACK]Return to tcp_var.h CVS log [TXT][DIR] Up to [local] / sys / netinet

Annotation of sys/netinet/tcp_var.h, Revision 1.1

1.1     ! nbrk        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_ */

CVSweb