The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/netinet/tcp_var.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: tcp_var.h,v 1.141.2.1 2008/01/21 20:17:48 bouyer Exp $ */
    2 
    3 /*
    4  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
    5  * All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. Neither the name of the project nor the names of its contributors
   16  *    may be used to endorse or promote products derived from this software
   17  *    without specific prior written permission.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
   20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
   23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   29  * SUCH DAMAGE.
   30  */
   31 
   32 /*
   33  *      @(#)COPYRIGHT   1.1 (NRL) 17 January 1995
   34  *
   35  * NRL grants permission for redistribution and use in source and binary
   36  * forms, with or without modification, of the software and documentation
   37  * created at NRL provided that the following conditions are met:
   38  *
   39  * 1. Redistributions of source code must retain the above copyright
   40  *    notice, this list of conditions and the following disclaimer.
   41  * 2. Redistributions in binary form must reproduce the above copyright
   42  *    notice, this list of conditions and the following disclaimer in the
   43  *    documentation and/or other materials provided with the distribution.
   44  * 3. All advertising materials mentioning features or use of this software
   45  *    must display the following acknowledgements:
   46  *      This product includes software developed by the University of
   47  *      California, Berkeley and its contributors.
   48  *      This product includes software developed at the Information
   49  *      Technology Division, US Naval Research Laboratory.
   50  * 4. Neither the name of the NRL nor the names of its contributors
   51  *    may be used to endorse or promote products derived from this software
   52  *    without specific prior written permission.
   53  *
   54  * THE SOFTWARE PROVIDED BY NRL IS PROVIDED BY NRL AND CONTRIBUTORS ``AS
   55  * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   56  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
   57  * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL NRL OR
   58  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   59  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   60  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   61  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   62  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   63  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   64  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   65  *
   66  * The views and conclusions contained in the software and documentation
   67  * are those of the authors and should not be interpreted as representing
   68  * official policies, either expressed or implied, of the US Naval
   69  * Research Laboratory (NRL).
   70  */
   71 
   72 /*-
   73  * Copyright (c) 1997, 1998, 1999, 2001, 2005 The NetBSD Foundation, Inc.
   74  * All rights reserved.
   75  *
   76  * This code is derived from software contributed to The NetBSD Foundation
   77  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
   78  * NASA Ames Research Center.
   79  * This code is derived from software contributed to The NetBSD Foundation
   80  * by Charles M. Hannum.
   81  *
   82  * Redistribution and use in source and binary forms, with or without
   83  * modification, are permitted provided that the following conditions
   84  * are met:
   85  * 1. Redistributions of source code must retain the above copyright
   86  *    notice, this list of conditions and the following disclaimer.
   87  * 2. Redistributions in binary form must reproduce the above copyright
   88  *    notice, this list of conditions and the following disclaimer in the
   89  *    documentation and/or other materials provided with the distribution.
   90  * 3. All advertising materials mentioning features or use of this software
   91  *    must display the following acknowledgement:
   92  *      This product includes software developed by the NetBSD
   93  *      Foundation, Inc. and its contributors.
   94  * 4. Neither the name of The NetBSD Foundation nor the names of its
   95  *    contributors may be used to endorse or promote products derived
   96  *    from this software without specific prior written permission.
   97  *
   98  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   99  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
  100  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  101  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
  102  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  103  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  104  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  105  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  106  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  107  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  108  * POSSIBILITY OF SUCH DAMAGE.
  109  */
  110 
  111 /*
  112  * Copyright (c) 1982, 1986, 1993, 1994, 1995
  113  *      The Regents of the University of California.  All rights reserved.
  114  *
  115  * Redistribution and use in source and binary forms, with or without
  116  * modification, are permitted provided that the following conditions
  117  * are met:
  118  * 1. Redistributions of source code must retain the above copyright
  119  *    notice, this list of conditions and the following disclaimer.
  120  * 2. Redistributions in binary form must reproduce the above copyright
  121  *    notice, this list of conditions and the following disclaimer in the
  122  *    documentation and/or other materials provided with the distribution.
  123  * 3. Neither the name of the University nor the names of its contributors
  124  *    may be used to endorse or promote products derived from this software
  125  *    without specific prior written permission.
  126  *
  127  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  128  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  129  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  130  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  131  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  132  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  133  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  134  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  135  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  136  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  137  * SUCH DAMAGE.
  138  *
  139  *      @(#)tcp_var.h   8.4 (Berkeley) 5/24/95
  140  */
  141 
  142 #ifndef _NETINET_TCP_VAR_H_
  143 #define _NETINET_TCP_VAR_H_
  144 
  145 #if defined(_KERNEL_OPT)
  146 #include "opt_inet.h"
  147 #include "opt_mbuftrace.h"
  148 #include "rnd.h"
  149 #endif
  150 
  151 /*
  152  * Kernel variables for tcp.
  153  */
  154 
  155 #include <sys/callout.h>
  156 
  157 #ifdef TCP_SIGNATURE
  158 /*
  159  * Defines which are needed by the xform_tcp module and tcp_[in|out]put
  160  * for SADB verification and lookup.
  161  */
  162 #define TCP_SIGLEN      16      /* length of computed digest in bytes */
  163 #define TCP_KEYLEN_MIN  1       /* minimum length of TCP-MD5 key */
  164 #define TCP_KEYLEN_MAX  80      /* maximum length of TCP-MD5 key */
  165 /*
  166  * Only a single SA per host may be specified at this time. An SPI is
  167  * needed in order for the KEY_ALLOCSA() lookup to work.
  168  */
  169 #define TCP_SIG_SPI     0x1000
  170 #endif /* TCP_SIGNATURE */
  171 
  172 /*
  173  * SACK option block.
  174  */
  175 struct sackblk {
  176         tcp_seq left;           /* Left edge of sack block. */
  177         tcp_seq right;          /* Right edge of sack block. */
  178 };
  179 
  180 TAILQ_HEAD(sackhead, sackhole);
  181 struct sackhole {
  182         tcp_seq start;
  183         tcp_seq end;
  184         tcp_seq rxmit;
  185 
  186         TAILQ_ENTRY(sackhole) sackhole_q;
  187 };
  188 
  189 /*
  190  * Tcp control block, one per tcp; fields:
  191  */
  192 struct tcpcb {
  193         int     t_family;               /* address family on the wire */
  194         struct ipqehead segq;           /* sequencing queue */
  195         int     t_segqlen;              /* length of the above */
  196         struct callout t_timer[TCPT_NTIMERS];/* tcp timers */
  197         short   t_state;                /* state of this connection */
  198         short   t_rxtshift;             /* log(2) of rexmt exp. backoff */
  199         uint32_t t_rxtcur;              /* current retransmit value */
  200         short   t_dupacks;              /* consecutive dup acks recd */
  201         short   t_partialacks;          /* partials acks during fast rexmit */
  202         u_short t_peermss;              /* peer's maximum segment size */
  203         u_short t_ourmss;               /* our's maximum segment size */
  204         u_short t_segsz;                /* current segment size in use */
  205         char    t_force;                /* 1 if forcing out a byte */
  206         u_int   t_flags;
  207 #define TF_ACKNOW       0x0001          /* ack peer immediately */
  208 #define TF_DELACK       0x0002          /* ack, but try to delay it */
  209 #define TF_NODELAY      0x0004          /* don't delay packets to coalesce */
  210 #define TF_NOOPT        0x0008          /* don't use tcp options */
  211 #define TF_REQ_SCALE    0x0020          /* have/will request window scaling */
  212 #define TF_RCVD_SCALE   0x0040          /* other side has requested scaling */
  213 #define TF_REQ_TSTMP    0x0080          /* have/will request timestamps */
  214 #define TF_RCVD_TSTMP   0x0100          /* a timestamp was received in SYN */
  215 #define TF_SACK_PERMIT  0x0200          /* other side said I could SACK */
  216 #define TF_SYN_REXMT    0x0400          /* rexmit timer fired on SYN */
  217 #define TF_WILL_SACK    0x0800          /* try to use SACK */
  218 #define TF_REASSEMBLING 0x1000          /* we're busy reassembling */
  219 #define TF_DEAD         0x2000          /* dead and to-be-released */
  220 #define TF_PMTUD_PEND   0x4000          /* Path MTU Discovery pending */
  221 #define TF_ECN_PERMIT   0x10000         /* other side said is ECN-ready */
  222 #define TF_ECN_SND_CWR  0x20000         /* ECN CWR in queue */
  223 #define TF_ECN_SND_ECE  0x40000         /* ECN ECE in queue */
  224 #define TF_SIGNATURE    0x400000        /* require MD5 digests (RFC2385) */
  225 
  226 
  227         struct  mbuf *t_template;       /* skeletal packet for transmit */
  228         struct  inpcb *t_inpcb;         /* back pointer to internet pcb */
  229         struct  in6pcb *t_in6pcb;       /* back pointer to internet pcb */
  230         struct  callout t_delack_ch;    /* delayed ACK callout */
  231 /*
  232  * The following fields are used as in the protocol specification.
  233  * See RFC793, Dec. 1981, page 21.
  234  */
  235 /* send sequence variables */
  236         tcp_seq snd_una;                /* send unacknowledged */
  237         tcp_seq snd_nxt;                /* send next */
  238         tcp_seq snd_up;                 /* send urgent pointer */
  239         tcp_seq snd_wl1;                /* window update seg seq number */
  240         tcp_seq snd_wl2;                /* window update seg ack number */
  241         tcp_seq iss;                    /* initial send sequence number */
  242         u_long  snd_wnd;                /* send window */
  243         tcp_seq snd_recover;            /* for use in fast recovery */
  244         tcp_seq snd_high;               /* NewReno false fast rexmit seq */
  245 /* receive sequence variables */
  246         u_long  rcv_wnd;                /* receive window */
  247         tcp_seq rcv_nxt;                /* receive next */
  248         tcp_seq rcv_up;                 /* receive urgent pointer */
  249         tcp_seq irs;                    /* initial receive sequence number */
  250 /*
  251  * Additional variables for this implementation.
  252  */
  253 /* receive variables */
  254         tcp_seq rcv_adv;                /* advertised window */
  255 /* retransmit variables */
  256         tcp_seq snd_max;                /* highest sequence number sent;
  257                                          * used to recognize retransmits
  258                                          */
  259 /* congestion control (for slow start, source quench, retransmit after loss) */
  260         u_long  snd_cwnd;               /* congestion-controlled window */
  261         u_long  snd_ssthresh;           /* snd_cwnd size threshhold for
  262                                          * for slow start exponential to
  263                                          * linear switch
  264                                          */
  265 /*
  266  * transmit timing stuff.  See below for scale of srtt and rttvar.
  267  * "Variance" is actually smoothed difference.
  268  */
  269         uint32_t t_rcvtime;             /* time last segment received */
  270         uint32_t t_rtttime;             /* time we started measuring rtt */
  271         tcp_seq t_rtseq;                /* sequence number being timed */
  272         int32_t t_srtt;                 /* smoothed round-trip time */
  273         int32_t t_rttvar;               /* variance in round-trip time */
  274         uint32_t t_rttmin;              /* minimum rtt allowed */
  275         u_long  max_sndwnd;             /* largest window peer has offered */
  276 
  277 /* out-of-band data */
  278         char    t_oobflags;             /* have some */
  279         char    t_iobc;                 /* input character */
  280 #define TCPOOB_HAVEDATA 0x01
  281 #define TCPOOB_HADDATA  0x02
  282         short   t_softerror;            /* possible error not yet reported */
  283 
  284 /* RFC 1323 variables */
  285         u_char  snd_scale;              /* window scaling for send window */
  286         u_char  rcv_scale;              /* window scaling for recv window */
  287         u_char  request_r_scale;        /* pending window scaling */
  288         u_char  requested_s_scale;
  289         u_int32_t ts_recent;            /* timestamp echo data */
  290         u_int32_t ts_recent_age;        /* when last updated */
  291         u_int32_t ts_timebase;          /* our timebase */
  292         tcp_seq last_ack_sent;
  293 
  294 /* RFC 3465 variables */
  295         u_long  t_bytes_acked;          /* ABC "bytes_acked" parameter */
  296 
  297 /* SACK stuff */
  298 #define TCP_SACK_MAX 3
  299 #define TCPSACK_NONE 0
  300 #define TCPSACK_HAVED 1
  301         u_char rcv_sack_flags;          /* SACK flags. */
  302         struct sackblk rcv_dsack_block; /* RX D-SACK block. */
  303         struct ipqehead timeq;          /* time sequenced queue. */
  304         struct sackhead snd_holes;      /* TX SACK holes. */
  305         int     snd_numholes;           /* Number of TX SACK holes. */
  306         tcp_seq rcv_lastsack;           /* last seq number(+1) sack'd by rcv'r*/
  307         tcp_seq sack_newdata;           /* New data xmitted in this recovery
  308                                            episode starts at this seq number*/
  309         tcp_seq snd_fack;               /* FACK TCP.  Forward-most data held by
  310                                            peer. */
  311 
  312 /* pointer for syn cache entries*/
  313         LIST_HEAD(, syn_cache) t_sc;    /* list of entries by this tcb */
  314 
  315 /* prediction of next mbuf when using large window sizes */
  316         struct  mbuf *t_lastm;          /* last mbuf that data was sent from */
  317         int     t_inoff;                /* data offset in previous mbuf */
  318         int     t_lastoff;              /* last data address in mbuf chain */
  319         int     t_lastlen;              /* last length read from mbuf chain */
  320 
  321 /* Path-MTU discovery blackhole detection */
  322         int t_mtudisc;                  /* perform mtudisc for this tcb */
  323 /* Path-MTU Discovery Information */
  324         u_int   t_pmtud_mss_acked;      /* MSS acked, lower bound for MTU */
  325         u_int   t_pmtud_mtu_sent;       /* MTU used, upper bound for MTU */
  326         tcp_seq t_pmtud_th_seq;         /* TCP SEQ from ICMP payload */
  327         u_int   t_pmtud_nextmtu;        /* Advertised Next-Hop MTU from ICMP */
  328         u_short t_pmtud_ip_len;         /* IP length from ICMP payload */
  329         u_short t_pmtud_ip_hl;          /* IP header length from ICMP payload */
  330 
  331         uint8_t t_ecn_retries;          /* # of ECN setup retries */
  332         
  333         struct tcp_congctl *t_congctl;  /* per TCB congctl algorithm */
  334 };
  335 
  336 /*
  337  * Macros to aid ECN TCP.
  338  */
  339 #define TCP_ECN_ALLOWED(tp)     (tp->t_flags & TF_ECN_PERMIT)
  340 
  341 /*
  342  * Macros to aid SACK/FACK TCP.
  343  */
  344 #define TCP_SACK_ENABLED(tp)    (tp->t_flags & TF_WILL_SACK)
  345 #define TCP_FACK_FASTRECOV(tp)  \
  346         (TCP_SACK_ENABLED(tp) && \
  347         (SEQ_GT(tp->snd_fack, tp->snd_una + tcprexmtthresh * tp->t_segsz)))
  348 
  349 #ifdef _KERNEL
  350 /*
  351  * TCP reassembly queue locks.
  352  */
  353 static __inline int tcp_reass_lock_try (struct tcpcb *)
  354         __attribute__((__unused__));
  355 static __inline void tcp_reass_unlock (struct tcpcb *)
  356         __attribute__((__unused__));
  357 
  358 static __inline int
  359 tcp_reass_lock_try(tp)
  360         struct tcpcb *tp;
  361 {
  362         int s;
  363 
  364         /*
  365          * Use splvm() -- we're blocking things that would cause
  366          * mbuf allocation.
  367          */
  368         s = splvm();
  369         if (tp->t_flags & TF_REASSEMBLING) {
  370                 splx(s);
  371                 return (0);
  372         }
  373         tp->t_flags |= TF_REASSEMBLING;
  374         splx(s);
  375         return (1);
  376 }
  377 
  378 static __inline void
  379 tcp_reass_unlock(tp)
  380         struct tcpcb *tp;
  381 {
  382         int s;
  383 
  384         s = splvm();
  385         tp->t_flags &= ~TF_REASSEMBLING;
  386         splx(s);
  387 }
  388 
  389 #ifdef DIAGNOSTIC
  390 #define TCP_REASS_LOCK(tp)                                              \
  391 do {                                                                    \
  392         if (tcp_reass_lock_try(tp) == 0) {                              \
  393                 printf("%s:%d: tcpcb %p reass already locked\n",        \
  394                     __FILE__, __LINE__, tp);                            \
  395                 panic("tcp_reass_lock");                                \
  396         }                                                               \
  397 } while (/*CONSTCOND*/ 0)
  398 #define TCP_REASS_LOCK_CHECK(tp)                                        \
  399 do {                                                                    \
  400         if (((tp)->t_flags & TF_REASSEMBLING) == 0) {                   \
  401                 printf("%s:%d: tcpcb %p reass lock not held\n",         \
  402                     __FILE__, __LINE__, tp);                            \
  403                 panic("tcp reass lock check");                          \
  404         }                                                               \
  405 } while (/*CONSTCOND*/ 0)
  406 #else
  407 #define TCP_REASS_LOCK(tp)      (void) tcp_reass_lock_try((tp))
  408 #define TCP_REASS_LOCK_CHECK(tp) /* nothing */
  409 #endif
  410 
  411 #define TCP_REASS_UNLOCK(tp)    tcp_reass_unlock((tp))
  412 #endif /* _KERNEL */
  413 
  414 /*
  415  * Queue for delayed ACK processing.
  416  */
  417 #ifdef _KERNEL
  418 extern int tcp_delack_ticks;
  419 void    tcp_delack(void *);
  420 
  421 #define TCP_RESTART_DELACK(tp)                                          \
  422         callout_reset(&(tp)->t_delack_ch, tcp_delack_ticks,             \
  423             tcp_delack, tp)
  424 
  425 #define TCP_SET_DELACK(tp)                                              \
  426 do {                                                                    \
  427         if (((tp)->t_flags & TF_DELACK) == 0) {                         \
  428                 (tp)->t_flags |= TF_DELACK;                             \
  429                 TCP_RESTART_DELACK(tp);                                 \
  430         }                                                               \
  431 } while (/*CONSTCOND*/0)
  432 
  433 #define TCP_CLEAR_DELACK(tp)                                            \
  434 do {                                                                    \
  435         if ((tp)->t_flags & TF_DELACK) {                                \
  436                 (tp)->t_flags &= ~TF_DELACK;                            \
  437                 callout_stop(&(tp)->t_delack_ch);                       \
  438         }                                                               \
  439 } while (/*CONSTCOND*/0)
  440 #endif /* _KERNEL */
  441 
  442 /*
  443  * Compute the current timestamp for a connection.
  444  */
  445 #define TCP_TIMESTAMP(tp)       (tcp_now - (tp)->ts_timebase)
  446 
  447 /*
  448  * Handy way of passing around TCP option info.
  449  */
  450 struct tcp_opt_info {
  451         int             ts_present;
  452         u_int32_t       ts_val;
  453         u_int32_t       ts_ecr;
  454         u_int16_t       maxseg;
  455 };
  456 
  457 #define TOF_SIGNATURE   0x0040          /* signature option present */
  458 #define TOF_SIGLEN      0x0080          /* sigature length valid (RFC2385) */
  459 
  460 /*
  461  * Data for the TCP compressed state engine.
  462  */
  463 union syn_cache_sa {
  464         struct sockaddr sa;
  465         struct sockaddr_in sin;
  466 #if 1 /*def INET6*/
  467         struct sockaddr_in6 sin6;
  468 #endif
  469 };
  470 
  471 struct syn_cache {
  472         TAILQ_ENTRY(syn_cache) sc_bucketq;      /* link on bucket list */
  473         struct callout sc_timer;                /* rexmt timer */
  474         union {                                 /* cached route */
  475                 struct route route4;
  476 #ifdef INET6
  477                 struct route_in6 route6;
  478 #endif
  479         } sc_route_u;
  480 #define sc_route4       sc_route_u.route4
  481 #ifdef INET6
  482 #define sc_route6       sc_route_u.route6
  483 #endif
  484         long sc_win;                            /* advertised window */
  485         int sc_bucketidx;                       /* our bucket index */
  486         u_int32_t sc_hash;
  487         u_int32_t sc_timestamp;                 /* timestamp from SYN */
  488         u_int32_t sc_timebase;                  /* our local timebase */
  489         union syn_cache_sa sc_src;
  490         union syn_cache_sa sc_dst;
  491         tcp_seq sc_irs;
  492         tcp_seq sc_iss;
  493         u_int sc_rxtcur;                        /* current rxt timeout */
  494         u_int sc_rxttot;                        /* total time spend on queues */
  495         u_short sc_rxtshift;                    /* for computing backoff */
  496         u_short sc_flags;
  497 
  498 #define SCF_UNREACH             0x0001          /* we've had an unreach error */
  499 #define SCF_TIMESTAMP           0x0002          /* peer will do timestamps */
  500 #define SCF_DEAD                0x0004          /* this entry to be released */
  501 #define SCF_SACK_PERMIT         0x0008          /* peer will do SACK */
  502 #define SCF_ECN_PERMIT          0x0010          /* peer will do ECN */
  503 #define SCF_SIGNATURE   0x40                    /* send MD5 digests */
  504 
  505         struct mbuf *sc_ipopts;                 /* IP options */
  506         u_int16_t sc_peermaxseg;
  507         u_int16_t sc_ourmaxseg;
  508         u_int8_t sc_request_r_scale     : 4,
  509                  sc_requested_s_scale   : 4;
  510 
  511         struct tcpcb *sc_tp;                    /* tcb for listening socket */
  512         LIST_ENTRY(syn_cache) sc_tpq;           /* list of entries by same tp */
  513 };
  514 
  515 struct syn_cache_head {
  516         TAILQ_HEAD(, syn_cache) sch_bucket;     /* bucket entries */
  517         u_short sch_length;                     /* # entries in bucket */
  518 };
  519 
  520 #define intotcpcb(ip)   ((struct tcpcb *)(ip)->inp_ppcb)
  521 #ifdef INET6
  522 #define in6totcpcb(ip)  ((struct tcpcb *)(ip)->in6p_ppcb)
  523 #endif
  524 #ifndef INET6
  525 #define sototcpcb(so)   (intotcpcb(sotoinpcb(so)))
  526 #else
  527 #define sototcpcb(so)   (((so)->so_proto->pr_domain->dom_family == AF_INET) \
  528                                 ? intotcpcb(sotoinpcb(so)) \
  529                                 : in6totcpcb(sotoin6pcb(so)))
  530 #endif
  531 
  532 /*
  533  * The smoothed round-trip time and estimated variance
  534  * are stored as fixed point numbers scaled by the values below.
  535  * For convenience, these scales are also used in smoothing the average
  536  * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed).
  537  * With these scales, srtt has 3 bits to the right of the binary point,
  538  * and thus an "ALPHA" of 0.875.  rttvar has 2 bits to the right of the
  539  * binary point, and is smoothed with an ALPHA of 0.75.
  540  */
  541 #define TCP_RTT_SHIFT           3       /* shift for srtt; 3 bits frac. */
  542 #define TCP_RTTVAR_SHIFT        2       /* multiplier for rttvar; 2 bits */
  543 
  544 /*
  545  * The initial retransmission should happen at rtt + 4 * rttvar.
  546  * Because of the way we do the smoothing, srtt and rttvar
  547  * will each average +1/2 tick of bias.  When we compute
  548  * the retransmit timer, we want 1/2 tick of rounding and
  549  * 1 extra tick because of +-1/2 tick uncertainty in the
  550  * firing of the timer.  The bias will give us exactly the
  551  * 1.5 tick we need.  But, because the bias is
  552  * statistical, we have to test that we don't drop below
  553  * the minimum feasible timer (which is 2 ticks).
  554  * This macro assumes that the value of 1<<TCP_RTTVAR_SHIFT
  555  * is the same as the multiplier for rttvar.
  556  */
  557 #define TCP_REXMTVAL(tp) \
  558         ((((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) >> 2)
  559 
  560 /*
  561  * Compute the initial window for slow start.
  562  */
  563 #define TCP_INITIAL_WINDOW(iw, segsz) \
  564         (((iw) == 0) ? (min(4 * (segsz), max(2 * (segsz), 4380))) : \
  565          ((segsz) * (iw)))
  566 
  567 /*
  568  * TCP statistics.
  569  * Many of these should be kept per connection,
  570  * but that's inconvenient at the moment.
  571  */
  572 struct  tcpstat {
  573         u_quad_t tcps_connattempt;      /* connections initiated */
  574         u_quad_t tcps_accepts;          /* connections accepted */
  575         u_quad_t tcps_connects;         /* connections established */
  576         u_quad_t tcps_drops;            /* connections dropped */
  577         u_quad_t tcps_conndrops;        /* embryonic connections dropped */
  578         u_quad_t tcps_closed;           /* conn. closed (includes drops) */
  579         u_quad_t tcps_segstimed;        /* segs where we tried to get rtt */
  580         u_quad_t tcps_rttupdated;       /* times we succeeded */
  581         u_quad_t tcps_delack;           /* delayed acks sent */
  582         u_quad_t tcps_timeoutdrop;      /* conn. dropped in rxmt timeout */
  583         u_quad_t tcps_rexmttimeo;       /* retransmit timeouts */
  584         u_quad_t tcps_persisttimeo;     /* persist timeouts */
  585         u_quad_t tcps_keeptimeo;        /* keepalive timeouts */
  586         u_quad_t tcps_keepprobe;        /* keepalive probes sent */
  587         u_quad_t tcps_keepdrops;        /* connections dropped in keepalive */
  588         u_quad_t tcps_persistdrops;     /* connections dropped in persist */
  589         u_quad_t tcps_connsdrained;     /* connections drained due to memory
  590                                            shortage */
  591         u_quad_t tcps_pmtublackhole;    /* PMTUD blackhole detected */
  592 
  593         u_quad_t tcps_sndtotal;         /* total packets sent */
  594         u_quad_t tcps_sndpack;          /* data packets sent */
  595         u_quad_t tcps_sndbyte;          /* data bytes sent */
  596         u_quad_t tcps_sndrexmitpack;    /* data packets retransmitted */
  597         u_quad_t tcps_sndrexmitbyte;    /* data bytes retransmitted */
  598         u_quad_t tcps_sndacks;          /* ack-only packets sent */
  599         u_quad_t tcps_sndprobe;         /* window probes sent */
  600         u_quad_t tcps_sndurg;           /* packets sent with URG only */
  601         u_quad_t tcps_sndwinup;         /* window update-only packets sent */
  602         u_quad_t tcps_sndctrl;          /* control (SYN|FIN|RST) packets sent */
  603 
  604         u_quad_t tcps_rcvtotal;         /* total packets received */
  605         u_quad_t tcps_rcvpack;          /* packets received in sequence */
  606         u_quad_t tcps_rcvbyte;          /* bytes received in sequence */
  607         u_quad_t tcps_rcvbadsum;        /* packets received with ccksum errs */
  608         u_quad_t tcps_rcvbadoff;        /* packets received with bad offset */
  609         u_quad_t tcps_rcvmemdrop;       /* packets dropped for lack of memory */
  610         u_quad_t tcps_rcvshort;         /* packets received too short */
  611         u_quad_t tcps_rcvduppack;       /* duplicate-only packets received */
  612         u_quad_t tcps_rcvdupbyte;       /* duplicate-only bytes received */
  613         u_quad_t tcps_rcvpartduppack;   /* packets with some duplicate data */
  614         u_quad_t tcps_rcvpartdupbyte;   /* dup. bytes in part-dup. packets */
  615         u_quad_t tcps_rcvoopack;        /* out-of-order packets received */
  616         u_quad_t tcps_rcvoobyte;        /* out-of-order bytes received */
  617         u_quad_t tcps_rcvpackafterwin;  /* packets with data after window */
  618         u_quad_t tcps_rcvbyteafterwin;  /* bytes rcvd after window */
  619         u_quad_t tcps_rcvafterclose;    /* packets rcvd after "close" */
  620         u_quad_t tcps_rcvwinprobe;      /* rcvd window probe packets */
  621         u_quad_t tcps_rcvdupack;        /* rcvd duplicate acks */
  622         u_quad_t tcps_rcvacktoomuch;    /* rcvd acks for unsent data */
  623         u_quad_t tcps_rcvackpack;       /* rcvd ack packets */
  624         u_quad_t tcps_rcvackbyte;       /* bytes acked by rcvd acks */
  625         u_quad_t tcps_rcvwinupd;        /* rcvd window update packets */
  626         u_quad_t tcps_pawsdrop;         /* segments dropped due to PAWS */
  627         u_quad_t tcps_predack;          /* times hdr predict ok for acks */
  628         u_quad_t tcps_preddat;          /* times hdr predict ok for data pkts */
  629 
  630         u_quad_t tcps_pcbhashmiss;      /* input packets missing pcb hash */
  631         u_quad_t tcps_noport;           /* no socket on port */
  632         u_quad_t tcps_badsyn;           /* received ack for which we have
  633                                            no SYN in compressed state */
  634         u_quad_t tcps_delayed_free;     /* delayed pool_put() of tcpcb */
  635 
  636         /* These statistics deal with the SYN cache. */
  637         u_quad_t tcps_sc_added;         /* # of entries added */
  638         u_quad_t tcps_sc_completed;     /* # of connections completed */
  639         u_quad_t tcps_sc_timed_out;     /* # of entries timed out */
  640         u_quad_t tcps_sc_overflowed;    /* # dropped due to overflow */
  641         u_quad_t tcps_sc_reset;         /* # dropped due to RST */
  642         u_quad_t tcps_sc_unreach;       /* # dropped due to ICMP unreach */
  643         u_quad_t tcps_sc_bucketoverflow;/* # dropped due to bucket overflow */
  644         u_quad_t tcps_sc_aborted;       /* # of entries aborted (no mem) */
  645         u_quad_t tcps_sc_dupesyn;       /* # of duplicate SYNs received */
  646         u_quad_t tcps_sc_dropped;       /* # of SYNs dropped (no route/mem) */
  647         u_quad_t tcps_sc_collisions;    /* # of hash collisions */
  648         u_quad_t tcps_sc_retransmitted; /* # of retransmissions */
  649         u_quad_t tcps_sc_delayed_free;  /* # of delayed pool_put()s */
  650 
  651         u_quad_t tcps_selfquench;       /* # of ENOBUFS we get on output */
  652         u_quad_t tcps_badsig;           /* # of drops due to bad signature */
  653         u_quad_t tcps_goodsig;          /* # of packets with good signature */
  654 
  655         u_quad_t tcps_ecn_shs;          /* # of sucessful ECN handshakes */
  656         u_quad_t tcps_ecn_ce;           /* # of packets with CE bit */
  657         u_quad_t tcps_ecn_ect;          /* # of packets with ECT(0) bit */
  658 };
  659 
  660 /*
  661  * Names for TCP sysctl objects.
  662  */
  663 #define TCPCTL_RFC1323          1       /* RFC1323 timestamps/scaling */
  664 #define TCPCTL_SENDSPACE        2       /* default send buffer */
  665 #define TCPCTL_RECVSPACE        3       /* default recv buffer */
  666 #define TCPCTL_MSSDFLT          4       /* default seg size */
  667 #define TCPCTL_SYN_CACHE_LIMIT  5       /* max size of comp. state engine */
  668 #define TCPCTL_SYN_BUCKET_LIMIT 6       /* max size of hash bucket */
  669 #if 0   /*obsoleted*/
  670 #define TCPCTL_SYN_CACHE_INTER  7       /* interval of comp. state timer */
  671 #endif
  672 #define TCPCTL_INIT_WIN         8       /* initial window */
  673 #define TCPCTL_MSS_IFMTU        9       /* mss from interface, not in_maxmtu */
  674 #define TCPCTL_SACK             10      /* RFC2018 selective acknowledgement */
  675 #define TCPCTL_WSCALE           11      /* RFC1323 window scaling */
  676 #define TCPCTL_TSTAMP           12      /* RFC1323 timestamps */
  677 #define TCPCTL_COMPAT_42        13      /* 4.2BSD TCP bug work-arounds */
  678 #define TCPCTL_CWM              14      /* Congestion Window Monitoring */
  679 #define TCPCTL_CWM_BURSTSIZE    15      /* burst size allowed by CWM */
  680 #define TCPCTL_ACK_ON_PUSH      16      /* ACK immediately on PUSH */
  681 #define TCPCTL_KEEPIDLE         17      /* keepalive idle time */
  682 #define TCPCTL_KEEPINTVL        18      /* keepalive probe interval */
  683 #define TCPCTL_KEEPCNT          19      /* keepalive count */
  684 #define TCPCTL_SLOWHZ           20      /* PR_SLOWHZ (read-only) */
  685 #define TCPCTL_NEWRENO          21      /* NewReno Congestion Control */
  686 #define TCPCTL_LOG_REFUSED      22      /* Log refused connections */
  687 #if 0   /*obsoleted*/
  688 #define TCPCTL_RSTRATELIMIT     23      /* RST rate limit */
  689 #endif
  690 #define TCPCTL_RSTPPSLIMIT      24      /* RST pps limit */
  691 #define TCPCTL_DELACK_TICKS     25      /* # ticks to delay ACK */
  692 #define TCPCTL_INIT_WIN_LOCAL   26      /* initial window for local nets */
  693 #define TCPCTL_IDENT            27      /* rfc 931 identd */
  694 #define TCPCTL_ACKDROPRATELIMIT 28      /* SYN/RST -> ACK rate limit */
  695 #define TCPCTL_LOOPBACKCKSUM    29      /* do TCP checksum on loopback */
  696 #define TCPCTL_STATS            30      /* TCP statistics */
  697 #define TCPCTL_DEBUG            31      /* TCP debug sockets */
  698 #define TCPCTL_DEBX             32      /* # of tcp debug sockets */
  699 #define TCPCTL_DROP             33      /* drop tcp connection */
  700 #define TCPCTL_MAXID            34
  701 
  702 #define TCPCTL_NAMES { \
  703         { 0, 0 }, \
  704         { "rfc1323",    CTLTYPE_INT }, \
  705         { "sendspace",  CTLTYPE_INT }, \
  706         { "recvspace",  CTLTYPE_INT }, \
  707         { "mssdflt",    CTLTYPE_INT }, \
  708         { "syn_cache_limit", CTLTYPE_INT }, \
  709         { "syn_bucket_limit", CTLTYPE_INT }, \
  710         { 0, 0 },\
  711         { "init_win", CTLTYPE_INT }, \
  712         { "mss_ifmtu", CTLTYPE_INT }, \
  713         { "sack", CTLTYPE_INT }, \
  714         { "win_scale", CTLTYPE_INT }, \
  715         { "timestamps", CTLTYPE_INT }, \
  716         { "compat_42", CTLTYPE_INT }, \
  717         { "cwm", CTLTYPE_INT }, \
  718         { "cwm_burstsize", CTLTYPE_INT }, \
  719         { "ack_on_push", CTLTYPE_INT }, \
  720         { "keepidle",   CTLTYPE_INT }, \
  721         { "keepintvl",  CTLTYPE_INT }, \
  722         { "keepcnt",    CTLTYPE_INT }, \
  723         { "slowhz",     CTLTYPE_INT }, \
  724         { 0, 0 }, \
  725         { "log_refused",CTLTYPE_INT }, \
  726         { 0, 0 }, \
  727         { "rstppslimit", CTLTYPE_INT }, \
  728         { "delack_ticks", CTLTYPE_INT }, \
  729         { "init_win_local", CTLTYPE_INT }, \
  730         { "ident", CTLTYPE_STRUCT }, \
  731         { "ackdropppslimit", CTLTYPE_INT }, \
  732         { "do_loopback_cksum", CTLTYPE_INT }, \
  733         { "stats", CTLTYPE_STRUCT }, \
  734         { "debug", CTLTYPE_STRUCT }, \
  735         { "debx", CTLTYPE_INT }, \
  736         { "drop", CTLTYPE_STRUCT }, \
  737 }
  738 
  739 #ifdef _KERNEL
  740 extern  struct inpcbtable tcbtable;     /* head of queue of active tcpcb's */
  741 extern  struct tcpstat tcpstat; /* tcp statistics */
  742 extern  u_int32_t tcp_now;      /* for RFC 1323 timestamps */
  743 extern  int tcp_do_rfc1323;     /* enabled/disabled? */
  744 extern  int tcp_do_sack;        /* SACK enabled/disabled? */
  745 extern  int tcp_do_win_scale;   /* RFC1323 window scaling enabled/disabled? */
  746 extern  int tcp_do_timestamps;  /* RFC1323 timestamps enabled/disabled? */
  747 extern  int tcp_mssdflt;        /* default seg size */
  748 extern  int tcp_init_win;       /* initial window */
  749 extern  int tcp_init_win_local; /* initial window for local nets */
  750 extern  int tcp_mss_ifmtu;      /* take MSS from interface, not in_maxmtu */
  751 extern  int tcp_compat_42;      /* work around ancient broken TCP peers */
  752 extern  int tcp_cwm;            /* enable Congestion Window Monitoring */
  753 extern  int tcp_cwm_burstsize;  /* burst size allowed by CWM */
  754 extern  int tcp_ack_on_push;    /* ACK immediately on PUSH */
  755 extern  int tcp_syn_cache_limit; /* max entries for compressed state engine */
  756 extern  int tcp_syn_bucket_limit;/* max entries per hash bucket */
  757 extern  int tcp_log_refused;    /* log refused connections */
  758 extern  int tcp_do_ecn;         /* TCP ECN enabled/disabled? */
  759 extern  int tcp_ecn_maxretries; /* Max ECN setup retries */
  760 #if NRND > 0
  761 extern  int tcp_do_rfc1948;     /* ISS by cryptographic hash */
  762 #endif
  763 extern int tcp_sack_tp_maxholes;        /* Max holes per connection. */
  764 extern int tcp_sack_globalmaxholes;     /* Max holes per system. */
  765 extern int tcp_sack_globalholes;        /* Number of holes present. */
  766 extern int tcp_do_abc;                  /* RFC3465 ABC enabled/disabled? */
  767 extern int tcp_abc_aggressive;          /* 1: L=2*SMSS  0: L=1*SMSS */
  768 
  769 extern  int tcp_rst_ppslim;
  770 extern  int tcp_ackdrop_ppslim;
  771 
  772 extern  int tcp_syn_cache_size;
  773 extern  struct syn_cache_head tcp_syn_cache[];
  774 extern  u_long syn_cache_count;
  775 
  776 #ifdef MBUFTRACE
  777 extern  struct mowner tcp_rx_mowner;
  778 extern  struct mowner tcp_tx_mowner;
  779 extern  struct mowner tcp_mowner;
  780 #endif
  781 
  782 #define TCPCTL_VARIABLES { \
  783         { 0 },                                  \
  784         { 1, 0, &tcp_do_rfc1323 },              \
  785         { 1, 0, &tcp_sendspace },               \
  786         { 1, 0, &tcp_recvspace },               \
  787         { 1, 0, &tcp_mssdflt },                 \
  788         { 1, 0, &tcp_syn_cache_limit },         \
  789         { 1, 0, &tcp_syn_bucket_limit },        \
  790         { 0 },                                  \
  791         { 1, 0, &tcp_init_win },                \
  792         { 1, 0, &tcp_mss_ifmtu },               \
  793         { 1, 0, &tcp_do_sack },                 \
  794         { 1, 0, &tcp_do_win_scale },            \
  795         { 1, 0, &tcp_do_timestamps },           \
  796         { 1, 0, &tcp_compat_42 },               \
  797         { 1, 0, &tcp_cwm },                     \
  798         { 1, 0, &tcp_cwm_burstsize },           \
  799         { 1, 0, &tcp_ack_on_push },             \
  800         { 1, 0, &tcp_keepidle },                \
  801         { 1, 0, &tcp_keepintvl },               \
  802         { 1, 0, &tcp_keepcnt },                 \
  803         { 1, 1, 0, PR_SLOWHZ },                 \
  804         { 0 },                                  \
  805         { 1, 0, &tcp_log_refused },             \
  806         { 0 },                                  \
  807         { 1, 0, &tcp_rst_ppslim },              \
  808         { 1, 0, &tcp_delack_ticks },            \
  809         { 1, 0, &tcp_init_win_local },          \
  810         { 1, 0, &tcp_ackdrop_ppslim },          \
  811 }
  812 
  813 #ifdef __NO_STRICT_ALIGNMENT
  814 #define TCP_HDR_ALIGNED_P(th)   1
  815 #else
  816 #define TCP_HDR_ALIGNED_P(th)   ((((vaddr_t)(th)) & 3) == 0)
  817 #endif
  818 
  819 struct secasvar;
  820 
  821 int      tcp_attach(struct socket *);
  822 void     tcp_canceltimers(struct tcpcb *);
  823 int      tcp_timers_invoking(struct tcpcb*);
  824 struct tcpcb *
  825          tcp_close(struct tcpcb *);
  826 int      tcp_isdead(struct tcpcb *);
  827 #ifdef INET6
  828 void     tcp6_ctlinput(int, struct sockaddr *, void *);
  829 #endif
  830 void     *tcp_ctlinput(int, struct sockaddr *, void *);
  831 int      tcp_ctloutput(int, struct socket *, int, int, struct mbuf **);
  832 struct tcpcb *
  833          tcp_disconnect(struct tcpcb *);
  834 struct tcpcb *
  835          tcp_drop(struct tcpcb *, int);
  836 #ifdef TCP_SIGNATURE
  837 int      tcp_signature_apply(void *, caddr_t, u_int);
  838 struct secasvar *tcp_signature_getsav(struct mbuf *, struct tcphdr *);
  839 int      tcp_signature(struct mbuf *, struct tcphdr *, int, struct secasvar *,
  840             char *);
  841 #endif
  842 void     tcp_drain(void);
  843 void     tcp_established(struct tcpcb *);
  844 void     tcp_init(void);
  845 #ifdef INET6
  846 int      tcp6_input(struct mbuf **, int *, int);
  847 #endif
  848 void     tcp_input(struct mbuf *, ...);
  849 u_int    tcp_hdrsz(struct tcpcb *);
  850 u_long   tcp_mss_to_advertise(const struct ifnet *, int);
  851 void     tcp_mss_from_peer(struct tcpcb *, int);
  852 void     tcp_tcpcb_template(void);
  853 struct tcpcb *
  854          tcp_newtcpcb(int, void *);
  855 void     tcp_notify(struct inpcb *, int);
  856 #ifdef INET6
  857 void     tcp6_notify(struct in6pcb *, int);
  858 #endif
  859 u_int    tcp_optlen(struct tcpcb *);
  860 int      tcp_output(struct tcpcb *);
  861 void     tcp_pulloutofband(struct socket *,
  862             struct tcphdr *, struct mbuf *, int);
  863 void     tcp_quench(struct inpcb *, int);
  864 #ifdef INET6
  865 void     tcp6_quench(struct in6pcb *, int);
  866 #endif
  867 void     tcp_mtudisc(struct inpcb *, int);
  868 
  869 struct ipqent *tcpipqent_alloc(void);
  870 void     tcpipqent_free(struct ipqent *);
  871 
  872 int      tcp_reass(struct tcpcb *, struct tcphdr *, struct mbuf *, int *);
  873 int      tcp_respond(struct tcpcb *, struct mbuf *, struct mbuf *,
  874             struct tcphdr *, tcp_seq, tcp_seq, int);
  875 void     tcp_rmx_rtt(struct tcpcb *);
  876 void     tcp_setpersist(struct tcpcb *);
  877 #ifdef TCP_SIGNATURE
  878 int      tcp_signature_compute(struct mbuf *, struct tcphdr *, int, int,
  879             int, u_char *, u_int);
  880 #endif
  881 void     tcp_slowtimo(void);
  882 struct mbuf *
  883          tcp_template(struct tcpcb *);
  884 void     tcp_trace(short, short, struct tcpcb *, struct mbuf *, int);
  885 struct tcpcb *
  886          tcp_usrclosed(struct tcpcb *);
  887 int      tcp_usrreq(struct socket *,
  888             int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *);
  889 void     tcp_xmit_timer(struct tcpcb *, uint32_t);
  890 tcp_seq  tcp_new_iss(struct tcpcb *, tcp_seq);
  891 tcp_seq  tcp_new_iss1(void *, void *, u_int16_t, u_int16_t, size_t,
  892             tcp_seq);
  893 
  894 void     tcp_new_dsack(struct tcpcb *, tcp_seq, u_int32_t);
  895 void     tcp_sack_option(struct tcpcb *, const struct tcphdr *,
  896             const u_char *, int);
  897 void     tcp_del_sackholes(struct tcpcb *, const struct tcphdr *);
  898 void     tcp_free_sackholes(struct tcpcb *);
  899 void     tcp_sack_adjust(struct tcpcb *tp);
  900 struct sackhole *tcp_sack_output(struct tcpcb *tp, int *sack_bytes_rexmt);
  901 void     tcp_sack_newack(struct tcpcb *, const struct tcphdr *);
  902 int      tcp_sack_numblks(const struct tcpcb *);
  903 #define TCP_SACK_OPTLEN(nblks)  ((nblks) * 8 + 2 + 2)
  904 
  905 int      syn_cache_add(struct sockaddr *, struct sockaddr *,
  906                 struct tcphdr *, unsigned int, struct socket *,
  907                 struct mbuf *, u_char *, int, struct tcp_opt_info *);
  908 void     syn_cache_unreach(const struct sockaddr *, const struct sockaddr *,
  909            struct tcphdr *);
  910 struct socket *syn_cache_get(struct sockaddr *, struct sockaddr *,
  911                 struct tcphdr *, unsigned int, unsigned int,
  912                 struct socket *so, struct mbuf *);
  913 void     syn_cache_init(void);
  914 void     syn_cache_insert(struct syn_cache *, struct tcpcb *);
  915 struct syn_cache *syn_cache_lookup(const struct sockaddr *, const struct sockaddr *,
  916                 struct syn_cache_head **);
  917 void     syn_cache_reset(struct sockaddr *, struct sockaddr *,
  918                 struct tcphdr *);
  919 int      syn_cache_respond(struct syn_cache *, struct mbuf *);
  920 void     syn_cache_timer(void *);
  921 void     syn_cache_cleanup(struct tcpcb *);
  922 
  923 int      tcp_input_checksum(int, struct mbuf *, const struct tcphdr *, int, int,
  924     int);
  925 #endif
  926 
  927 #endif /* !_NETINET_TCP_VAR_H_ */

Cache object: 52fcc23c2c8d3da182a1c339aca8daee


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.