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.123.2.2 2005/05/06 08:35:20 tron 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 #endif
  149 
  150 /*
  151  * Kernel variables for tcp.
  152  */
  153 
  154 #include <sys/callout.h>
  155 
  156 #ifdef TCP_SIGNATURE
  157 /*
  158  * Defines which are needed by the xform_tcp module and tcp_[in|out]put
  159  * for SADB verification and lookup.
  160  */
  161 #define TCP_SIGLEN      16      /* length of computed digest in bytes */
  162 #define TCP_KEYLEN_MIN  1       /* minimum length of TCP-MD5 key */
  163 #define TCP_KEYLEN_MAX  80      /* maximum length of TCP-MD5 key */
  164 /*
  165  * Only a single SA per host may be specified at this time. An SPI is
  166  * needed in order for the KEY_ALLOCSA() lookup to work.
  167  */
  168 #define TCP_SIG_SPI     0x1000
  169 #endif /* TCP_SIGNATURE */
  170 
  171 /*
  172  * SACK option block.
  173  */
  174 struct sackblk {
  175         tcp_seq left;           /* Left edge of sack block. */
  176         tcp_seq right;          /* Right edge of sack block. */
  177 };
  178 
  179 TAILQ_HEAD(sackhead, sackhole);
  180 struct sackhole {
  181         tcp_seq start;
  182         tcp_seq end;
  183         tcp_seq rxmit;
  184 
  185         TAILQ_ENTRY(sackhole) sackhole_q;
  186 };
  187 
  188 /*
  189  * Tcp control block, one per tcp; fields:
  190  */
  191 struct tcpcb {
  192         int     t_family;               /* address family on the wire */
  193         struct ipqehead segq;           /* sequencing queue */
  194         int     t_segqlen;              /* length of the above */
  195         struct callout t_timer[TCPT_NTIMERS];/* tcp timers */
  196         short   t_state;                /* state of this connection */
  197         short   t_rxtshift;             /* log(2) of rexmt exp. backoff */
  198         uint32_t t_rxtcur;              /* current retransmit value */
  199         short   t_dupacks;              /* consecutive dup acks recd */
  200         short   t_partialacks;          /* partials acks during fast rexmit */
  201         u_short t_peermss;              /* peer's maximum segment size */
  202         u_short t_ourmss;               /* our's maximum segment size */
  203         u_short t_segsz;                /* current segment size in use */
  204         char    t_force;                /* 1 if forcing out a byte */
  205         u_int   t_flags;
  206 #define TF_ACKNOW       0x0001          /* ack peer immediately */
  207 #define TF_DELACK       0x0002          /* ack, but try to delay it */
  208 #define TF_NODELAY      0x0004          /* don't delay packets to coalesce */
  209 #define TF_NOOPT        0x0008          /* don't use tcp options */
  210 #define TF_REQ_SCALE    0x0020          /* have/will request window scaling */
  211 #define TF_RCVD_SCALE   0x0040          /* other side has requested scaling */
  212 #define TF_REQ_TSTMP    0x0080          /* have/will request timestamps */
  213 #define TF_RCVD_TSTMP   0x0100          /* a timestamp was received in SYN */
  214 #define TF_SACK_PERMIT  0x0200          /* other side said I could SACK */
  215 #define TF_SYN_REXMT    0x0400          /* rexmit timer fired on SYN */
  216 #define TF_WILL_SACK    0x0800          /* try to use SACK */
  217 #define TF_REASSEMBLING 0x1000          /* we're busy reassembling */
  218 #define TF_DEAD         0x2000          /* dead and to-be-released */
  219 #define TF_SIGNATURE    0x400000        /* require MD5 digests (RFC2385) */
  220 
  221 
  222         struct  mbuf *t_template;       /* skeletal packet for transmit */
  223         struct  inpcb *t_inpcb;         /* back pointer to internet pcb */
  224         struct  in6pcb *t_in6pcb;       /* back pointer to internet pcb */
  225         struct  callout t_delack_ch;    /* delayed ACK callout */
  226 /*
  227  * The following fields are used as in the protocol specification.
  228  * See RFC783, Dec. 1981, page 21.
  229  */
  230 /* send sequence variables */
  231         tcp_seq snd_una;                /* send unacknowledged */
  232         tcp_seq snd_nxt;                /* send next */
  233         tcp_seq snd_up;                 /* send urgent pointer */
  234         tcp_seq snd_wl1;                /* window update seg seq number */
  235         tcp_seq snd_wl2;                /* window update seg ack number */
  236         tcp_seq iss;                    /* initial send sequence number */
  237         u_long  snd_wnd;                /* send window */
  238         tcp_seq snd_recover;            /* for use in fast recovery */
  239         tcp_seq snd_high;               /* NewReno false fast rexmit seq */
  240 /* receive sequence variables */
  241         u_long  rcv_wnd;                /* receive window */
  242         tcp_seq rcv_nxt;                /* receive next */
  243         tcp_seq rcv_up;                 /* receive urgent pointer */
  244         tcp_seq irs;                    /* initial receive sequence number */
  245 /*
  246  * Additional variables for this implementation.
  247  */
  248 /* receive variables */
  249         tcp_seq rcv_adv;                /* advertised window */
  250 /* retransmit variables */
  251         tcp_seq snd_max;                /* highest sequence number sent;
  252                                          * used to recognize retransmits
  253                                          */
  254 /* congestion control (for slow start, source quench, retransmit after loss) */
  255         u_long  snd_cwnd;               /* congestion-controlled window */
  256         u_long  snd_ssthresh;           /* snd_cwnd size threshhold for
  257                                          * for slow start exponential to
  258                                          * linear switch
  259                                          */
  260 /*
  261  * transmit timing stuff.  See below for scale of srtt and rttvar.
  262  * "Variance" is actually smoothed difference.
  263  */
  264         uint32_t t_rcvtime;             /* time last segment received */
  265         uint32_t t_rtttime;             /* time we started measuring rtt */
  266         tcp_seq t_rtseq;                /* sequence number being timed */
  267         int32_t t_srtt;                 /* smoothed round-trip time */
  268         int32_t t_rttvar;               /* variance in round-trip time */
  269         uint32_t t_rttmin;              /* minimum rtt allowed */
  270         u_long  max_sndwnd;             /* largest window peer has offered */
  271 
  272 /* out-of-band data */
  273         char    t_oobflags;             /* have some */
  274         char    t_iobc;                 /* input character */
  275 #define TCPOOB_HAVEDATA 0x01
  276 #define TCPOOB_HADDATA  0x02
  277         short   t_softerror;            /* possible error not yet reported */
  278 
  279 /* RFC 1323 variables */
  280         u_char  snd_scale;              /* window scaling for send window */
  281         u_char  rcv_scale;              /* window scaling for recv window */
  282         u_char  request_r_scale;        /* pending window scaling */
  283         u_char  requested_s_scale;
  284         u_int32_t ts_recent;            /* timestamp echo data */
  285         u_int32_t ts_recent_age;        /* when last updated */
  286         u_int32_t ts_timebase;          /* our timebase */
  287         tcp_seq last_ack_sent;
  288 
  289 /* SACK stuff */
  290 #define TCP_SACK_MAX 3
  291 #define TCPSACK_NONE 0
  292 #define TCPSACK_HAVED 1
  293         u_char rcv_sack_flags;          /* SACK flags. */
  294         struct sackblk rcv_dsack_block; /* RX D-SACK block. */
  295         struct ipqehead timeq;          /* time sequenced queue. */
  296         struct sackhead snd_holes;      /* TX SACK holes. */
  297         int     snd_numholes;           /* Number of TX SACK holes. */
  298         tcp_seq rcv_lastsack;           /* last seq number(+1) sack'd by rcv'r*/
  299         tcp_seq sack_newdata;           /* New data xmitted in this recovery
  300                                            episode starts at this seq number*/
  301         tcp_seq snd_fack;               /* FACK TCP.  Forward-most data held by
  302                                            peer. */
  303 
  304 /* path MTU discovery blackhole detection */
  305         int t_mtudisc;                  /* perform mtudisc for this tcb */
  306 
  307 /* pointer for syn cache entries*/
  308         LIST_HEAD(, syn_cache) t_sc;    /* list of entries by this tcb */
  309 
  310 /* prediction of next mbuf when using large window sizes */
  311         struct  mbuf *t_lastm;          /* last mbuf that data was sent from */
  312         int     t_inoff;                /* data offset in previous mbuf */
  313         int     t_lastoff;              /* last data address in mbuf chain */
  314         int     t_lastlen;              /* last length read from mbuf chain */
  315 };
  316 
  317 /*
  318  * Macros to aid SACK/FACK TCP.
  319  */
  320 #define TCP_SACK_ENABLED(tp)    (tp->t_flags & TF_WILL_SACK)
  321 #define TCP_FACK_FASTRECOV(tp)  \
  322         (TCP_SACK_ENABLED(tp) && \
  323         (SEQ_GT(tp->snd_fack, tp->snd_una + tcprexmtthresh * tp->t_segsz)))
  324 
  325 #ifdef _KERNEL
  326 /*
  327  * TCP reassembly queue locks.
  328  */
  329 static __inline int tcp_reass_lock_try (struct tcpcb *)
  330         __attribute__((__unused__));
  331 static __inline void tcp_reass_unlock (struct tcpcb *)
  332         __attribute__((__unused__));
  333 
  334 static __inline int
  335 tcp_reass_lock_try(tp)
  336         struct tcpcb *tp;
  337 {
  338         int s;
  339 
  340         /*
  341          * Use splvm() -- we're blocking things that would cause
  342          * mbuf allocation.
  343          */
  344         s = splvm();
  345         if (tp->t_flags & TF_REASSEMBLING) {
  346                 splx(s);
  347                 return (0);
  348         }
  349         tp->t_flags |= TF_REASSEMBLING;
  350         splx(s);
  351         return (1);
  352 }
  353 
  354 static __inline void
  355 tcp_reass_unlock(tp)
  356         struct tcpcb *tp;
  357 {
  358         int s;
  359 
  360         s = splvm();
  361         tp->t_flags &= ~TF_REASSEMBLING;
  362         splx(s);
  363 }
  364 
  365 #ifdef DIAGNOSTIC
  366 #define TCP_REASS_LOCK(tp)                                              \
  367 do {                                                                    \
  368         if (tcp_reass_lock_try(tp) == 0) {                              \
  369                 printf("%s:%d: tcpcb %p reass already locked\n",        \
  370                     __FILE__, __LINE__, tp);                            \
  371                 panic("tcp_reass_lock");                                \
  372         }                                                               \
  373 } while (/*CONSTCOND*/ 0)
  374 #define TCP_REASS_LOCK_CHECK(tp)                                        \
  375 do {                                                                    \
  376         if (((tp)->t_flags & TF_REASSEMBLING) == 0) {                   \
  377                 printf("%s:%d: tcpcb %p reass lock not held\n",         \
  378                     __FILE__, __LINE__, tp);                            \
  379                 panic("tcp reass lock check");                          \
  380         }                                                               \
  381 } while (/*CONSTCOND*/ 0)
  382 #else
  383 #define TCP_REASS_LOCK(tp)      (void) tcp_reass_lock_try((tp))
  384 #define TCP_REASS_LOCK_CHECK(tp) /* nothing */
  385 #endif
  386 
  387 #define TCP_REASS_UNLOCK(tp)    tcp_reass_unlock((tp))
  388 #endif /* _KERNEL */
  389 
  390 /*
  391  * Queue for delayed ACK processing.
  392  */
  393 #ifdef _KERNEL
  394 extern int tcp_delack_ticks;
  395 void    tcp_delack(void *);
  396 
  397 #define TCP_RESTART_DELACK(tp)                                          \
  398         callout_reset(&(tp)->t_delack_ch, tcp_delack_ticks,             \
  399             tcp_delack, tp)
  400 
  401 #define TCP_SET_DELACK(tp)                                              \
  402 do {                                                                    \
  403         if (((tp)->t_flags & TF_DELACK) == 0) {                         \
  404                 (tp)->t_flags |= TF_DELACK;                             \
  405                 TCP_RESTART_DELACK(tp);                                 \
  406         }                                                               \
  407 } while (/*CONSTCOND*/0)
  408 
  409 #define TCP_CLEAR_DELACK(tp)                                            \
  410 do {                                                                    \
  411         if ((tp)->t_flags & TF_DELACK) {                                \
  412                 (tp)->t_flags &= ~TF_DELACK;                            \
  413                 callout_stop(&(tp)->t_delack_ch);                       \
  414         }                                                               \
  415 } while (/*CONSTCOND*/0)
  416 #endif /* _KERNEL */
  417 
  418 /*
  419  * Compute the current timestamp for a connection.
  420  */
  421 #define TCP_TIMESTAMP(tp)       (tcp_now - (tp)->ts_timebase)
  422 
  423 /*
  424  * Handy way of passing around TCP option info.
  425  */
  426 struct tcp_opt_info {
  427         int             ts_present;
  428         u_int32_t       ts_val;
  429         u_int32_t       ts_ecr;
  430         u_int16_t       maxseg;
  431 };
  432 
  433 #define TOF_SIGNATURE   0x0040          /* signature option present */
  434 #define TOF_SIGLEN      0x0080          /* sigature length valid (RFC2385) */
  435 
  436 /*
  437  * Data for the TCP compressed state engine.
  438  */
  439 union syn_cache_sa {
  440         struct sockaddr sa;
  441         struct sockaddr_in sin;
  442 #if 1 /*def INET6*/
  443         struct sockaddr_in6 sin6;
  444 #endif
  445 };
  446 
  447 struct syn_cache {
  448         TAILQ_ENTRY(syn_cache) sc_bucketq;      /* link on bucket list */
  449         struct callout sc_timer;                /* rexmt timer */
  450         union {                                 /* cached route */
  451                 struct route route4;
  452 #ifdef INET6
  453                 struct route_in6 route6;
  454 #endif
  455         } sc_route_u;
  456 #define sc_route4       sc_route_u.route4
  457 #ifdef INET6
  458 #define sc_route6       sc_route_u.route6
  459 #endif
  460         long sc_win;                            /* advertised window */
  461         int sc_bucketidx;                       /* our bucket index */
  462         u_int32_t sc_hash;
  463         u_int32_t sc_timestamp;                 /* timestamp from SYN */
  464         u_int32_t sc_timebase;                  /* our local timebase */
  465         union syn_cache_sa sc_src;
  466         union syn_cache_sa sc_dst;
  467         tcp_seq sc_irs;
  468         tcp_seq sc_iss;
  469         u_int sc_rxtcur;                        /* current rxt timeout */
  470         u_int sc_rxttot;                        /* total time spend on queues */
  471         u_short sc_rxtshift;                    /* for computing backoff */
  472         u_short sc_flags;
  473 
  474 #define SCF_UNREACH             0x0001          /* we've had an unreach error */
  475 #define SCF_TIMESTAMP           0x0002          /* peer will do timestamps */
  476 #define SCF_DEAD                0x0004          /* this entry to be released */
  477 #define SCF_SACK_PERMIT         0x0008          /* peer will do SACK */
  478 #define SCF_SIGNATURE   0x40                    /* send MD5 digests */
  479 
  480         struct mbuf *sc_ipopts;                 /* IP options */
  481         u_int16_t sc_peermaxseg;
  482         u_int16_t sc_ourmaxseg;
  483         u_int8_t sc_request_r_scale     : 4,
  484                  sc_requested_s_scale   : 4;
  485 
  486         struct tcpcb *sc_tp;                    /* tcb for listening socket */
  487         LIST_ENTRY(syn_cache) sc_tpq;           /* list of entries by same tp */
  488 };
  489 
  490 struct syn_cache_head {
  491         TAILQ_HEAD(, syn_cache) sch_bucket;     /* bucket entries */
  492         u_short sch_length;                     /* # entries in bucket */
  493 };
  494 
  495 #define intotcpcb(ip)   ((struct tcpcb *)(ip)->inp_ppcb)
  496 #ifdef INET6
  497 #define in6totcpcb(ip)  ((struct tcpcb *)(ip)->in6p_ppcb)
  498 #endif
  499 #ifndef INET6
  500 #define sototcpcb(so)   (intotcpcb(sotoinpcb(so)))
  501 #else
  502 #define sototcpcb(so)   (((so)->so_proto->pr_domain->dom_family == AF_INET) \
  503                                 ? intotcpcb(sotoinpcb(so)) \
  504                                 : in6totcpcb(sotoin6pcb(so)))
  505 #endif
  506 
  507 /*
  508  * The smoothed round-trip time and estimated variance
  509  * are stored as fixed point numbers scaled by the values below.
  510  * For convenience, these scales are also used in smoothing the average
  511  * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed).
  512  * With these scales, srtt has 3 bits to the right of the binary point,
  513  * and thus an "ALPHA" of 0.875.  rttvar has 2 bits to the right of the
  514  * binary point, and is smoothed with an ALPHA of 0.75.
  515  */
  516 #define TCP_RTT_SHIFT           3       /* shift for srtt; 3 bits frac. */
  517 #define TCP_RTTVAR_SHIFT        2       /* multiplier for rttvar; 2 bits */
  518 
  519 /*
  520  * The initial retransmission should happen at rtt + 4 * rttvar.
  521  * Because of the way we do the smoothing, srtt and rttvar
  522  * will each average +1/2 tick of bias.  When we compute
  523  * the retransmit timer, we want 1/2 tick of rounding and
  524  * 1 extra tick because of +-1/2 tick uncertainty in the
  525  * firing of the timer.  The bias will give us exactly the
  526  * 1.5 tick we need.  But, because the bias is
  527  * statistical, we have to test that we don't drop below
  528  * the minimum feasible timer (which is 2 ticks).
  529  * This macro assumes that the value of 1<<TCP_RTTVAR_SHIFT
  530  * is the same as the multiplier for rttvar.
  531  */
  532 #define TCP_REXMTVAL(tp) \
  533         ((((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) >> 2)
  534 
  535 /*
  536  * Compute the initial window for slow start.
  537  */
  538 #define TCP_INITIAL_WINDOW(iw, segsz) \
  539         (((iw) == 0) ? (min(4 * (segsz), max(2 * (segsz), 4380))) : \
  540          ((segsz) * (iw)))
  541 
  542 /*
  543  * TCP statistics.
  544  * Many of these should be kept per connection,
  545  * but that's inconvenient at the moment.
  546  */
  547 struct  tcpstat {
  548         u_quad_t tcps_connattempt;      /* connections initiated */
  549         u_quad_t tcps_accepts;          /* connections accepted */
  550         u_quad_t tcps_connects;         /* connections established */
  551         u_quad_t tcps_drops;            /* connections dropped */
  552         u_quad_t tcps_conndrops;        /* embryonic connections dropped */
  553         u_quad_t tcps_closed;           /* conn. closed (includes drops) */
  554         u_quad_t tcps_segstimed;        /* segs where we tried to get rtt */
  555         u_quad_t tcps_rttupdated;       /* times we succeeded */
  556         u_quad_t tcps_delack;           /* delayed acks sent */
  557         u_quad_t tcps_timeoutdrop;      /* conn. dropped in rxmt timeout */
  558         u_quad_t tcps_rexmttimeo;       /* retransmit timeouts */
  559         u_quad_t tcps_persisttimeo;     /* persist timeouts */
  560         u_quad_t tcps_keeptimeo;        /* keepalive timeouts */
  561         u_quad_t tcps_keepprobe;        /* keepalive probes sent */
  562         u_quad_t tcps_keepdrops;        /* connections dropped in keepalive */
  563         u_quad_t tcps_persistdrops;     /* connections dropped in persist */
  564         u_quad_t tcps_connsdrained;     /* connections drained due to memory
  565                                            shortage */
  566         u_quad_t tcps_pmtublackhole;    /* PMTUD blackhole detected */
  567 
  568         u_quad_t tcps_sndtotal;         /* total packets sent */
  569         u_quad_t tcps_sndpack;          /* data packets sent */
  570         u_quad_t tcps_sndbyte;          /* data bytes sent */
  571         u_quad_t tcps_sndrexmitpack;    /* data packets retransmitted */
  572         u_quad_t tcps_sndrexmitbyte;    /* data bytes retransmitted */
  573         u_quad_t tcps_sndacks;          /* ack-only packets sent */
  574         u_quad_t tcps_sndprobe;         /* window probes sent */
  575         u_quad_t tcps_sndurg;           /* packets sent with URG only */
  576         u_quad_t tcps_sndwinup;         /* window update-only packets sent */
  577         u_quad_t tcps_sndctrl;          /* control (SYN|FIN|RST) packets sent */
  578 
  579         u_quad_t tcps_rcvtotal;         /* total packets received */
  580         u_quad_t tcps_rcvpack;          /* packets received in sequence */
  581         u_quad_t tcps_rcvbyte;          /* bytes received in sequence */
  582         u_quad_t tcps_rcvbadsum;        /* packets received with ccksum errs */
  583         u_quad_t tcps_rcvbadoff;        /* packets received with bad offset */
  584         u_quad_t tcps_rcvmemdrop;       /* packets dropped for lack of memory */
  585         u_quad_t tcps_rcvshort;         /* packets received too short */
  586         u_quad_t tcps_rcvduppack;       /* duplicate-only packets received */
  587         u_quad_t tcps_rcvdupbyte;       /* duplicate-only bytes received */
  588         u_quad_t tcps_rcvpartduppack;   /* packets with some duplicate data */
  589         u_quad_t tcps_rcvpartdupbyte;   /* dup. bytes in part-dup. packets */
  590         u_quad_t tcps_rcvoopack;        /* out-of-order packets received */
  591         u_quad_t tcps_rcvoobyte;        /* out-of-order bytes received */
  592         u_quad_t tcps_rcvpackafterwin;  /* packets with data after window */
  593         u_quad_t tcps_rcvbyteafterwin;  /* bytes rcvd after window */
  594         u_quad_t tcps_rcvafterclose;    /* packets rcvd after "close" */
  595         u_quad_t tcps_rcvwinprobe;      /* rcvd window probe packets */
  596         u_quad_t tcps_rcvdupack;        /* rcvd duplicate acks */
  597         u_quad_t tcps_rcvacktoomuch;    /* rcvd acks for unsent data */
  598         u_quad_t tcps_rcvackpack;       /* rcvd ack packets */
  599         u_quad_t tcps_rcvackbyte;       /* bytes acked by rcvd acks */
  600         u_quad_t tcps_rcvwinupd;        /* rcvd window update packets */
  601         u_quad_t tcps_pawsdrop;         /* segments dropped due to PAWS */
  602         u_quad_t tcps_predack;          /* times hdr predict ok for acks */
  603         u_quad_t tcps_preddat;          /* times hdr predict ok for data pkts */
  604 
  605         u_quad_t tcps_pcbhashmiss;      /* input packets missing pcb hash */
  606         u_quad_t tcps_noport;           /* no socket on port */
  607         u_quad_t tcps_badsyn;           /* received ack for which we have
  608                                            no SYN in compressed state */
  609         u_quad_t tcps_delayed_free;     /* delayed pool_put() of tcpcb */
  610 
  611         /* These statistics deal with the SYN cache. */
  612         u_quad_t tcps_sc_added;         /* # of entries added */
  613         u_quad_t tcps_sc_completed;     /* # of connections completed */
  614         u_quad_t tcps_sc_timed_out;     /* # of entries timed out */
  615         u_quad_t tcps_sc_overflowed;    /* # dropped due to overflow */
  616         u_quad_t tcps_sc_reset;         /* # dropped due to RST */
  617         u_quad_t tcps_sc_unreach;       /* # dropped due to ICMP unreach */
  618         u_quad_t tcps_sc_bucketoverflow;/* # dropped due to bucket overflow */
  619         u_quad_t tcps_sc_aborted;       /* # of entries aborted (no mem) */
  620         u_quad_t tcps_sc_dupesyn;       /* # of duplicate SYNs received */
  621         u_quad_t tcps_sc_dropped;       /* # of SYNs dropped (no route/mem) */
  622         u_quad_t tcps_sc_collisions;    /* # of hash collisions */
  623         u_quad_t tcps_sc_retransmitted; /* # of retransmissions */
  624         u_quad_t tcps_sc_delayed_free;  /* # of delayed pool_put()s */
  625 
  626         u_quad_t tcps_selfquench;       /* # of ENOBUFS we get on output */
  627         u_quad_t tcps_badsig;           /* # of drops due to bad signature */
  628         u_quad_t tcps_goodsig;          /* # of packets with good signature */
  629 };
  630 
  631 /*
  632  * Names for TCP sysctl objects.
  633  */
  634 #define TCPCTL_RFC1323          1       /* RFC1323 timestamps/scaling */
  635 #define TCPCTL_SENDSPACE        2       /* default send buffer */
  636 #define TCPCTL_RECVSPACE        3       /* default recv buffer */
  637 #define TCPCTL_MSSDFLT          4       /* default seg size */
  638 #define TCPCTL_SYN_CACHE_LIMIT  5       /* max size of comp. state engine */
  639 #define TCPCTL_SYN_BUCKET_LIMIT 6       /* max size of hash bucket */
  640 #if 0   /*obsoleted*/
  641 #define TCPCTL_SYN_CACHE_INTER  7       /* interval of comp. state timer */
  642 #endif
  643 #define TCPCTL_INIT_WIN         8       /* initial window */
  644 #define TCPCTL_MSS_IFMTU        9       /* mss from interface, not in_maxmtu */
  645 #define TCPCTL_SACK             10      /* RFC2018 selective acknowledgement */
  646 #define TCPCTL_WSCALE           11      /* RFC1323 window scaling */
  647 #define TCPCTL_TSTAMP           12      /* RFC1323 timestamps */
  648 #define TCPCTL_COMPAT_42        13      /* 4.2BSD TCP bug work-arounds */
  649 #define TCPCTL_CWM              14      /* Congestion Window Monitoring */
  650 #define TCPCTL_CWM_BURSTSIZE    15      /* burst size allowed by CWM */
  651 #define TCPCTL_ACK_ON_PUSH      16      /* ACK immediately on PUSH */
  652 #define TCPCTL_KEEPIDLE         17      /* keepalive idle time */
  653 #define TCPCTL_KEEPINTVL        18      /* keepalive probe interval */
  654 #define TCPCTL_KEEPCNT          19      /* keepalive count */
  655 #define TCPCTL_SLOWHZ           20      /* PR_SLOWHZ (read-only) */
  656 #define TCPCTL_NEWRENO          21      /* NewReno Congestion Control */
  657 #define TCPCTL_LOG_REFUSED      22      /* Log refused connections */
  658 #if 0   /*obsoleted*/
  659 #define TCPCTL_RSTRATELIMIT     23      /* RST rate limit */
  660 #endif
  661 #define TCPCTL_RSTPPSLIMIT      24      /* RST pps limit */
  662 #define TCPCTL_DELACK_TICKS     25      /* # ticks to delay ACK */
  663 #define TCPCTL_INIT_WIN_LOCAL   26      /* initial window for local nets */
  664 #define TCPCTL_IDENT            27      /* rfc 931 identd */
  665 #define TCPCTL_ACKDROPRATELIMIT 28      /* SYN/RST -> ACK rate limit */
  666 #define TCPCTL_LOOPBACKCKSUM    29      /* do TCP checksum on loopback */
  667 #define TCPCTL_MAXID            30
  668 
  669 #define TCPCTL_NAMES { \
  670         { 0, 0 }, \
  671         { "rfc1323",    CTLTYPE_INT }, \
  672         { "sendspace",  CTLTYPE_INT }, \
  673         { "recvspace",  CTLTYPE_INT }, \
  674         { "mssdflt",    CTLTYPE_INT }, \
  675         { "syn_cache_limit", CTLTYPE_INT }, \
  676         { "syn_bucket_limit", CTLTYPE_INT }, \
  677         { 0, 0 },\
  678         { "init_win", CTLTYPE_INT }, \
  679         { "mss_ifmtu", CTLTYPE_INT }, \
  680         { "sack", CTLTYPE_INT }, \
  681         { "win_scale", CTLTYPE_INT }, \
  682         { "timestamps", CTLTYPE_INT }, \
  683         { "compat_42", CTLTYPE_INT }, \
  684         { "cwm", CTLTYPE_INT }, \
  685         { "cwm_burstsize", CTLTYPE_INT }, \
  686         { "ack_on_push", CTLTYPE_INT }, \
  687         { "keepidle",   CTLTYPE_INT }, \
  688         { "keepintvl",  CTLTYPE_INT }, \
  689         { "keepcnt",    CTLTYPE_INT }, \
  690         { "slowhz",     CTLTYPE_INT }, \
  691         { "newreno",    CTLTYPE_INT }, \
  692         { "log_refused",CTLTYPE_INT }, \
  693         { 0, 0 }, \
  694         { "rstppslimit", CTLTYPE_INT }, \
  695         { "delack_ticks", CTLTYPE_INT }, \
  696         { "init_win_local", CTLTYPE_INT }, \
  697         { "ident", CTLTYPE_STRUCT }, \
  698         { "ackdropppslimit", CTLTYPE_INT }, \
  699         { "do_loopback_cksum", CTLTYPE_INT }, \
  700 }
  701 
  702 #ifdef _KERNEL
  703 extern  struct inpcbtable tcbtable;     /* head of queue of active tcpcb's */
  704 extern  struct tcpstat tcpstat; /* tcp statistics */
  705 extern  u_int32_t tcp_now;      /* for RFC 1323 timestamps */
  706 extern  int tcp_do_rfc1323;     /* enabled/disabled? */
  707 extern  int tcp_do_sack;        /* SACK enabled/disabled? */
  708 extern  int tcp_do_win_scale;   /* RFC1323 window scaling enabled/disabled? */
  709 extern  int tcp_do_timestamps;  /* RFC1323 timestamps enabled/disabled? */
  710 extern  int tcp_do_newreno;     /* Use the New Reno algorithms */
  711 extern  int tcp_mssdflt;        /* default seg size */
  712 extern  int tcp_init_win;       /* initial window */
  713 extern  int tcp_init_win_local; /* initial window for local nets */
  714 extern  int tcp_mss_ifmtu;      /* take MSS from interface, not in_maxmtu */
  715 extern  int tcp_compat_42;      /* work around ancient broken TCP peers */
  716 extern  int tcp_cwm;            /* enable Congestion Window Monitoring */
  717 extern  int tcp_cwm_burstsize;  /* burst size allowed by CWM */
  718 extern  int tcp_ack_on_push;    /* ACK immediately on PUSH */
  719 extern  int tcp_syn_cache_limit; /* max entries for compressed state engine */
  720 extern  int tcp_syn_bucket_limit;/* max entries per hash bucket */
  721 extern  int tcp_log_refused;    /* log refused connections */
  722 extern  int tcp_do_loopback_cksum;/* do TCP checksum on loopback? */
  723 extern int tcp_sack_tp_maxholes;        /* Max holes per connection. */
  724 extern int tcp_sack_globalmaxholes;     /* Max holes per system. */
  725 extern int tcp_sack_globalholes;        /* Number of holes present. */
  726 
  727 extern  int tcp_rst_ppslim;
  728 extern  int tcp_ackdrop_ppslim;
  729 
  730 extern  int tcp_syn_cache_size;
  731 extern  struct syn_cache_head tcp_syn_cache[];
  732 extern  u_long syn_cache_count;
  733 
  734 #ifdef MBUFTRACE
  735 extern  struct mowner tcp_rx_mowner;
  736 extern  struct mowner tcp_tx_mowner;
  737 extern  struct mowner tcp_mowner;
  738 #endif
  739 
  740 #define TCPCTL_VARIABLES { \
  741         { 0 },                                  \
  742         { 1, 0, &tcp_do_rfc1323 },              \
  743         { 1, 0, &tcp_sendspace },               \
  744         { 1, 0, &tcp_recvspace },               \
  745         { 1, 0, &tcp_mssdflt },                 \
  746         { 1, 0, &tcp_syn_cache_limit },         \
  747         { 1, 0, &tcp_syn_bucket_limit },        \
  748         { 0 },                                  \
  749         { 1, 0, &tcp_init_win },                \
  750         { 1, 0, &tcp_mss_ifmtu },               \
  751         { 1, 0, &tcp_do_sack },                 \
  752         { 1, 0, &tcp_do_win_scale },            \
  753         { 1, 0, &tcp_do_timestamps },           \
  754         { 1, 0, &tcp_compat_42 },               \
  755         { 1, 0, &tcp_cwm },                     \
  756         { 1, 0, &tcp_cwm_burstsize },           \
  757         { 1, 0, &tcp_ack_on_push },             \
  758         { 1, 0, &tcp_keepidle },                \
  759         { 1, 0, &tcp_keepintvl },               \
  760         { 1, 0, &tcp_keepcnt },                 \
  761         { 1, 1, 0, PR_SLOWHZ },                 \
  762         { 1, 0, &tcp_do_newreno },              \
  763         { 1, 0, &tcp_log_refused },             \
  764         { 0 },                                  \
  765         { 1, 0, &tcp_rst_ppslim },              \
  766         { 1, 0, &tcp_delack_ticks },            \
  767         { 1, 0, &tcp_init_win_local },          \
  768         { 1, 0, &tcp_ackdrop_ppslim },          \
  769 }
  770 
  771 #ifdef __NO_STRICT_ALIGNMENT
  772 #define TCP_HDR_ALIGNED_P(th)   1
  773 #else
  774 #define TCP_HDR_ALIGNED_P(th)   ((((vaddr_t)(th)) & 3) == 0)
  775 #endif
  776 
  777 struct secasvar;
  778 
  779 int      tcp_attach(struct socket *);
  780 void     tcp_canceltimers(struct tcpcb *);
  781 int      tcp_timers_invoking(struct tcpcb*);
  782 struct tcpcb *
  783          tcp_close(struct tcpcb *);
  784 int      tcp_isdead(struct tcpcb *);
  785 #ifdef INET6
  786 void     tcp6_ctlinput(int, struct sockaddr *, void *);
  787 #endif
  788 void     *tcp_ctlinput(int, struct sockaddr *, void *);
  789 int      tcp_ctloutput(int, struct socket *, int, int, struct mbuf **);
  790 struct tcpcb *
  791          tcp_disconnect(struct tcpcb *);
  792 struct tcpcb *
  793          tcp_drop(struct tcpcb *, int);
  794 #ifdef TCP_SIGNATURE
  795 int      tcp_signature_apply(void *, caddr_t, u_int);
  796 struct secasvar *tcp_signature_getsav(struct mbuf *, struct tcphdr *);
  797 int      tcp_signature(struct mbuf *, struct tcphdr *, int, struct secasvar *,
  798             char *);
  799 #endif
  800 int      tcp_dooptions(struct tcpcb *, u_char *, int, struct tcphdr *,
  801             struct mbuf *, int, struct tcp_opt_info *);
  802 void     tcp_drain(void);
  803 void     tcp_established(struct tcpcb *);
  804 void     tcp_init(void);
  805 #ifdef INET6
  806 int      tcp6_input(struct mbuf **, int *, int);
  807 #endif
  808 void     tcp_input(struct mbuf *, ...);
  809 u_long   tcp_mss_to_advertise(const struct ifnet *, int);
  810 void     tcp_mss_from_peer(struct tcpcb *, int);
  811 void     tcp_tcpcb_template(void);
  812 struct tcpcb *
  813          tcp_newtcpcb(int, void *);
  814 void     tcp_notify(struct inpcb *, int);
  815 #ifdef INET6
  816 void     tcp6_notify(struct in6pcb *, int);
  817 #endif
  818 u_int    tcp_optlen(struct tcpcb *);
  819 int      tcp_output(struct tcpcb *);
  820 void     tcp_pulloutofband(struct socket *,
  821             struct tcphdr *, struct mbuf *, int);
  822 void     tcp_quench(struct inpcb *, int);
  823 #ifdef INET6
  824 void     tcp6_quench(struct in6pcb *, int);
  825 #endif
  826 
  827 struct ipqent *tcpipqent_alloc(void);
  828 void     tcpipqent_free(struct ipqent *);
  829 
  830 int      tcp_reass(struct tcpcb *, struct tcphdr *, struct mbuf *, int *);
  831 int      tcp_respond(struct tcpcb *, struct mbuf *, struct mbuf *,
  832             struct tcphdr *, tcp_seq, tcp_seq, int);
  833 void     tcp_rmx_rtt(struct tcpcb *);
  834 void     tcp_setpersist(struct tcpcb *);
  835 #ifdef TCP_SIGNATURE
  836 int      tcp_signature_compute(struct mbuf *, struct tcphdr *, int, int,
  837             int, u_char *, u_int);
  838 #endif
  839 void     tcp_slowtimo(void);
  840 struct mbuf *
  841          tcp_template(struct tcpcb *);
  842 void     tcp_trace(short, short, struct tcpcb *, struct mbuf *, int);
  843 struct tcpcb *
  844          tcp_usrclosed(struct tcpcb *);
  845 int      tcp_usrreq(struct socket *,
  846             int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *);
  847 void     tcp_xmit_timer(struct tcpcb *, uint32_t);
  848 tcp_seq  tcp_new_iss(struct tcpcb *, tcp_seq);
  849 tcp_seq  tcp_new_iss1(void *, void *, u_int16_t, u_int16_t, size_t,
  850             tcp_seq);
  851 
  852 void     tcp_new_dsack(struct tcpcb *, tcp_seq, u_int32_t);
  853 void     tcp_sack_option(struct tcpcb *, struct tcphdr *, u_char *, int);
  854 void     tcp_del_sackholes(struct tcpcb *, struct tcphdr *);
  855 void     tcp_free_sackholes(struct tcpcb *);
  856 void     tcp_sack_adjust(struct tcpcb *tp);
  857 struct sackhole *tcp_sack_output(struct tcpcb *tp, int *sack_bytes_rexmt);
  858 void     tcp_sack_newack(struct tcpcb *, struct tcphdr *);
  859 int      tcp_sack_numblks(const struct tcpcb *);
  860 #define TCP_SACK_OPTLEN(nblks)  ((nblks) * 8 + 2 + 2)
  861 
  862 int      syn_cache_add(struct sockaddr *, struct sockaddr *,
  863                 struct tcphdr *, unsigned int, struct socket *,
  864                 struct mbuf *, u_char *, int, struct tcp_opt_info *);
  865 void     syn_cache_unreach(struct sockaddr *, struct sockaddr *,
  866            struct tcphdr *);
  867 struct socket *syn_cache_get(struct sockaddr *, struct sockaddr *,
  868                 struct tcphdr *, unsigned int, unsigned int,
  869                 struct socket *so, struct mbuf *);
  870 void     syn_cache_init(void);
  871 void     syn_cache_insert(struct syn_cache *, struct tcpcb *);
  872 struct syn_cache *syn_cache_lookup(struct sockaddr *, struct sockaddr *,
  873                 struct syn_cache_head **);
  874 void     syn_cache_reset(struct sockaddr *, struct sockaddr *,
  875                 struct tcphdr *);
  876 int      syn_cache_respond(struct syn_cache *, struct mbuf *);
  877 void     syn_cache_timer(void *);
  878 void     syn_cache_cleanup(struct tcpcb *);
  879 
  880 void     tcp_reno_newack(struct tcpcb *, struct tcphdr *);
  881 void     tcp_newreno_newack(struct tcpcb *, struct tcphdr *);
  882 
  883 int      tcp_input_checksum(int, struct mbuf *, const struct tcphdr *, int, int,
  884     int);
  885 #endif
  886 
  887 #endif /* _NETINET_TCP_VAR_H_ */

Cache object: 129c953adc985000dc375fc44a8e240e


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