home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 4 / hacker04 / 04_HACK04.ISO / darwin / darwinx86.iso / usr / include / netinet / tcp_var.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-09-30  |  18.5 KB  |  493 lines

  1. /*
  2.  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
  3.  *
  4.  * @APPLE_LICENSE_HEADER_START@
  5.  * 
  6.  * The contents of this file constitute Original Code as defined in and
  7.  * are subject to the Apple Public Source License Version 1.1 (the
  8.  * "License").  You may not use this file except in compliance with the
  9.  * License.  Please obtain a copy of the License at
  10.  * http://www.apple.com/publicsource and read it before using this file.
  11.  * 
  12.  * This Original Code and all software distributed under the License are
  13.  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  14.  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  15.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
  16.  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
  17.  * License for the specific language governing rights and limitations
  18.  * under the License.
  19.  * 
  20.  * @APPLE_LICENSE_HEADER_END@
  21.  */
  22. /*
  23.  * Copyright (c) 1982, 1986, 1993, 1994, 1995
  24.  *    The Regents of the University of California.  All rights reserved.
  25.  *
  26.  * Redistribution and use in source and binary forms, with or without
  27.  * modification, are permitted provided that the following conditions
  28.  * are met:
  29.  * 1. Redistributions of source code must retain the above copyright
  30.  *    notice, this list of conditions and the following disclaimer.
  31.  * 2. Redistributions in binary form must reproduce the above copyright
  32.  *    notice, this list of conditions and the following disclaimer in the
  33.  *    documentation and/or other materials provided with the distribution.
  34.  * 3. All advertising materials mentioning features or use of this software
  35.  *    must display the following acknowledgement:
  36.  *    This product includes software developed by the University of
  37.  *    California, Berkeley and its contributors.
  38.  * 4. Neither the name of the University nor the names of its contributors
  39.  *    may be used to endorse or promote products derived from this software
  40.  *    without specific prior written permission.
  41.  *
  42.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  43.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  44.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  45.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  46.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  47.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  48.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  49.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  50.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  51.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  52.  * SUCH DAMAGE.
  53.  *
  54.  *    @(#)tcp_var.h    8.4 (Berkeley) 5/24/95
  55.  */
  56.  
  57. #ifndef _NETINET_TCP_VAR_H_
  58. #define _NETINET_TCP_VAR_H_
  59. #define N_TIME_WAIT_SLOTS   128                /* must be power of 2 */
  60.  
  61. /*
  62.  * Ip (reassembly or sequence) queue structures.
  63.  *
  64.  * XXX -- The following explains why the ipqe_m field is here, for TCP's use:
  65.  * We want to avoid doing m_pullup on incoming packets but that
  66.  * means avoiding dtom on the tcp reassembly code.  That in turn means
  67.  * keeping an mbuf pointer in the reassembly queue (since we might
  68.  * have a cluster).  As a quick hack, the source & destination
  69.  * port numbers (which are no longer needed once we've located the
  70.  * tcpcb) are overlayed with an mbuf pointer.
  71.  */
  72. LIST_HEAD(ipqehead, ipqent);
  73. struct ipqent {
  74.     LIST_ENTRY(ipqent) ipqe_q;
  75.     union {
  76.         struct ip    *_ip;
  77. #if INET6
  78.         struct ipv6    *_ip6;
  79. #endif
  80.         struct tcpiphdr *_tcp;
  81.     } _ipqe_u1;
  82.     struct mbuf    *ipqe_m;    /* mbuf contains packet */
  83.     u_int8_t    ipqe_mff;    /* for IP fragmentation */
  84. };
  85. #define    ipqe_ip        _ipqe_u1._ip
  86. #if INET6
  87. #define    ipqe_ip6    _ipqe_u1._ip6
  88. #endif
  89. #define    ipqe_tcp    _ipqe_u1._tcp
  90. #define tcp6cb        tcpcb  /* for KAME src sync over BSD*'s */
  91.  
  92. #define TCP_DELACK_BITSET(hash_elem)\
  93. delack_bitmask[((hash_elem) >> 5)] |= 1 << ((hash_elem) & 0x1F)
  94.  
  95. #define DELACK_BITMASK_ON     1
  96. #define DELACK_BITMASK_THRESH 300
  97.  
  98. /*
  99.  * Kernel variables for tcp.
  100.  */
  101.  
  102. /*
  103.  * Tcp control block, one per tcp; fields:
  104.  * Organized for 16 byte cacheline efficiency.
  105.  */
  106. struct tcpcb {
  107.     struct ipqehead segq;        /* sequencing queue */
  108.     int    t_dupacks;        /* consecutive dup acks recd */
  109.     struct tcptemp    *t_template;    /* skeletal packet for transmit */
  110.  
  111.     int    t_timer[TCPT_NTIMERS];    /* tcp timers */
  112.  
  113.     struct    inpcb *t_inpcb;        /* back pointer to internet pcb */
  114.     int    t_state;        /* state of this connection */
  115.     u_int    t_flags;
  116. #define    TF_ACKNOW    0x00001        /* ack peer immediately */
  117. #define    TF_DELACK    0x00002        /* ack, but try to delay it */
  118. #define    TF_NODELAY    0x00004        /* don't delay packets to coalesce */
  119. #define    TF_NOOPT    0x00008        /* don't use tcp options */
  120. #define    TF_SENTFIN    0x00010        /* have sent FIN */
  121. #define    TF_REQ_SCALE    0x00020        /* have/will request window scaling */
  122. #define    TF_RCVD_SCALE    0x00040        /* other side has requested scaling */
  123. #define    TF_REQ_TSTMP    0x00080        /* have/will request timestamps */
  124. #define    TF_RCVD_TSTMP    0x00100        /* a timestamp was received in SYN */
  125. #define    TF_SACK_PERMIT    0x00200        /* other side said I could SACK */
  126. #define    TF_NEEDSYN    0x00400        /* send SYN (implicit state) */
  127. #define    TF_NEEDFIN    0x00800        /* send FIN (implicit state) */
  128. #define    TF_NOPUSH    0x01000        /* don't push */
  129. #define    TF_REQ_CC    0x02000        /* have/will request CC */
  130. #define    TF_RCVD_CC    0x04000        /* a CC was received in SYN */
  131. #define    TF_SENDCCNEW    0x08000        /* send CCnew instead of CC in SYN */
  132. #define    TF_MORETOCOME    0x10000        /* More data to be appended to sock */
  133.     int    t_force;        /* 1 if forcing out a byte */
  134.  
  135.     tcp_seq    snd_una;        /* send unacknowledged */
  136.     tcp_seq    snd_max;        /* highest sequence number sent;
  137.                      * used to recognize retransmits
  138.                      */
  139.     tcp_seq    snd_nxt;        /* send next */
  140.     tcp_seq    snd_up;            /* send urgent pointer */
  141.  
  142.     tcp_seq    snd_wl1;        /* window update seg seq number */
  143.     tcp_seq    snd_wl2;        /* window update seg ack number */
  144.     tcp_seq    iss;            /* initial send sequence number */
  145.     tcp_seq    irs;            /* initial receive sequence number */
  146.  
  147.     tcp_seq    rcv_nxt;        /* receive next */
  148.     tcp_seq    rcv_adv;        /* advertised window */
  149.     u_long    rcv_wnd;        /* receive window */
  150.     tcp_seq    rcv_up;            /* receive urgent pointer */
  151.  
  152.     u_long    snd_wnd;        /* send window */
  153.     u_long    snd_cwnd;        /* congestion-controlled window */
  154.     u_long    snd_ssthresh;        /* snd_cwnd size threshold for
  155.                      * for slow start exponential to
  156.                      * linear switch
  157.                      */
  158.     u_int    t_maxopd;        /* mss plus options */
  159.  
  160.     u_int    t_idle;            /* inactivity time */
  161.     u_long    t_duration;        /* connection duration */
  162.     int    t_rtt;            /* round trip time */
  163.     tcp_seq    t_rtseq;        /* sequence number being timed */
  164.  
  165.     int    t_rxtcur;        /* current retransmit value */
  166.     u_int    t_maxseg;        /* maximum segment size */
  167.     int    t_srtt;            /* smoothed round-trip time */
  168.     int    t_rttvar;        /* variance in round-trip time */
  169.  
  170.     int    t_rxtshift;        /* log(2) of rexmt exp. backoff */
  171.     u_int    t_rttmin;        /* minimum rtt allowed */
  172.     u_long    t_rttupdated;        /* number of times rtt sampled */
  173.     u_long    max_sndwnd;        /* largest window peer has offered */
  174.  
  175.     int    t_softerror;        /* possible error not yet reported */
  176. /* out-of-band data */
  177.     char    t_oobflags;        /* have some */
  178.     char    t_iobc;            /* input character */
  179. #define    TCPOOB_HAVEDATA    0x01
  180. #define    TCPOOB_HADDATA    0x02
  181. /* RFC 1323 variables */
  182.     u_char    snd_scale;        /* window scaling for send window */
  183.     u_char    rcv_scale;        /* window scaling for recv window */
  184.     u_char    request_r_scale;    /* pending window scaling */
  185.     u_char    requested_s_scale;
  186.     u_long    ts_recent;        /* timestamp echo data */
  187.  
  188.     u_long    ts_recent_age;        /* when last updated */
  189.     tcp_seq    last_ack_sent;
  190. /* RFC 1644 variables */
  191.     tcp_cc    cc_send;        /* send connection count */
  192.     tcp_cc    cc_recv;        /* receive connection count */
  193.     u_long    reserved[4];
  194. };
  195.  
  196. /*
  197.  * Structure to hold TCP options that are only used during segment
  198.  * processing (in tcp_input), but not held in the tcpcb.
  199.  * It's basically used to reduce the number of parameters
  200.  * to tcp_dooptions.
  201.  */
  202. struct tcpopt {
  203.     u_long    to_flag;        /* which options are present */
  204. #define TOF_TS        0x0001        /* timestamp */
  205. #define TOF_CC        0x0002        /* CC and CCnew are exclusive */
  206. #define TOF_CCNEW    0x0004
  207. #define    TOF_CCECHO    0x0008
  208.     u_long    to_tsval;
  209.     u_long    to_tsecr;
  210.     tcp_cc    to_cc;        /* holds CC or CCnew */
  211.     tcp_cc    to_ccecho;
  212.     u_short to_maxseg;
  213. };
  214.  
  215. /*
  216.  * The TAO cache entry which is stored in the protocol family specific
  217.  * portion of the route metrics.
  218.  */
  219. struct rmxp_tao {
  220.     tcp_cc    tao_cc;            /* latest CC in valid SYN */
  221.     tcp_cc    tao_ccsent;        /* latest CC sent to peer */
  222.     u_short    tao_mssopt;        /* peer's cached MSS */
  223. #ifdef notyet
  224.     u_short    tao_flags;        /* cache status flags */
  225. #define    TAOF_DONT    0x0001        /* peer doesn't understand rfc1644 */
  226. #define    TAOF_OK        0x0002        /* peer does understand rfc1644 */
  227. #define    TAOF_UNDEF    0        /* we don't know yet */
  228. #endif /* notyet */
  229. };
  230. #define rmx_taop(r)    ((struct rmxp_tao *)(r).rmx_filler)
  231.  
  232. #define    intotcpcb(ip)    ((struct tcpcb *)(ip)->inp_ppcb)
  233. #define    sototcpcb(so)    (intotcpcb(sotoinpcb(so)))
  234.  
  235. /*
  236.  * The smoothed round-trip time and estimated variance
  237.  * are stored as fixed point numbers scaled by the values below.
  238.  * For convenience, these scales are also used in smoothing the average
  239.  * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed).
  240.  * With these scales, srtt has 3 bits to the right of the binary point,
  241.  * and thus an "ALPHA" of 0.875.  rttvar has 2 bits to the right of the
  242.  * binary point, and is smoothed with an ALPHA of 0.75.
  243.  */
  244. #define    TCP_RTT_SCALE        32    /* multiplier for srtt; 3 bits frac. */
  245. #define    TCP_RTT_SHIFT        5    /* shift for srtt; 3 bits frac. */
  246. #define    TCP_RTTVAR_SCALE    16    /* multiplier for rttvar; 2 bits */
  247. #define    TCP_RTTVAR_SHIFT    4    /* shift for rttvar; 2 bits */
  248. #define    TCP_DELTA_SHIFT        2    /* see tcp_input.c */
  249.  
  250. /*
  251.  * The initial retransmission should happen at rtt + 4 * rttvar.
  252.  * Because of the way we do the smoothing, srtt and rttvar
  253.  * will each average +1/2 tick of bias.  When we compute
  254.  * the retransmit timer, we want 1/2 tick of rounding and
  255.  * 1 extra tick because of +-1/2 tick uncertainty in the
  256.  * firing of the timer.  The bias will give us exactly the
  257.  * 1.5 tick we need.  But, because the bias is
  258.  * statistical, we have to test that we don't drop below
  259.  * the minimum feasible timer (which is 2 ticks).
  260.  * This version of the macro adapted from a paper by Lawrence
  261.  * Brakmo and Larry Peterson which outlines a problem caused
  262.  * by insufficient precision in the original implementation,
  263.  * which results in inappropriately large RTO values for very
  264.  * fast networks.
  265.  */
  266. #define    TCP_REXMTVAL(tp) \
  267.     max((tp)->t_rttmin, (((tp)->t_srtt >> (TCP_RTT_SHIFT - TCP_DELTA_SHIFT))  \
  268.       + (tp)->t_rttvar) >> TCP_DELTA_SHIFT)
  269.  
  270. /*
  271.  * TCP statistics.
  272.  * Many of these should be kept per connection,
  273.  * but that's inconvenient at the moment.
  274.  */
  275. struct    tcpstat {
  276.     u_long    tcps_connattempt;    /* connections initiated */
  277.     u_long    tcps_accepts;        /* connections accepted */
  278.     u_long    tcps_connects;        /* connections established */
  279.     u_long    tcps_drops;        /* connections dropped */
  280.     u_long    tcps_conndrops;        /* embryonic connections dropped */
  281.     u_long    tcps_closed;        /* conn. closed (includes drops) */
  282.     u_long    tcps_segstimed;        /* segs where we tried to get rtt */
  283.     u_long    tcps_rttupdated;    /* times we succeeded */
  284.     u_long    tcps_delack;        /* delayed acks sent */
  285.     u_long    tcps_timeoutdrop;    /* conn. dropped in rxmt timeout */
  286.     u_long    tcps_rexmttimeo;    /* retransmit timeouts */
  287.     u_long    tcps_persisttimeo;    /* persist timeouts */
  288.     u_long    tcps_keeptimeo;        /* keepalive timeouts */
  289.     u_long    tcps_keepprobe;        /* keepalive probes sent */
  290.     u_long    tcps_keepdrops;        /* connections dropped in keepalive */
  291.  
  292.     u_long    tcps_sndtotal;        /* total packets sent */
  293.     u_long    tcps_sndpack;        /* data packets sent */
  294.     u_long    tcps_sndbyte;        /* data bytes sent */
  295.     u_long    tcps_sndrexmitpack;    /* data packets retransmitted */
  296.     u_long    tcps_sndrexmitbyte;    /* data bytes retransmitted */
  297.     u_long    tcps_sndacks;        /* ack-only packets sent */
  298.     u_long    tcps_sndprobe;        /* window probes sent */
  299.     u_long    tcps_sndurg;        /* packets sent with URG only */
  300.     u_long    tcps_sndwinup;        /* window update-only packets sent */
  301.     u_long    tcps_sndctrl;        /* control (SYN|FIN|RST) packets sent */
  302.  
  303.     u_long    tcps_rcvtotal;        /* total packets received */
  304.     u_long    tcps_rcvpack;        /* packets received in sequence */
  305.     u_long    tcps_rcvbyte;        /* bytes received in sequence */
  306.     u_long    tcps_rcvbadsum;        /* packets received with ccksum errs */
  307.     u_long    tcps_rcvbadoff;        /* packets received with bad offset */
  308.     u_long    tcps_rcvmemdrop;    /* packets dropped for lack of memory */
  309.     u_long    tcps_rcvshort;        /* packets received too short */
  310.     u_long    tcps_rcvduppack;    /* duplicate-only packets received */
  311.     u_long    tcps_rcvdupbyte;    /* duplicate-only bytes received */
  312.     u_long    tcps_rcvpartduppack;    /* packets with some duplicate data */
  313.     u_long    tcps_rcvpartdupbyte;    /* dup. bytes in part-dup. packets */
  314.     u_long    tcps_rcvoopack;        /* out-of-order packets received */
  315.     u_long    tcps_rcvoobyte;        /* out-of-order bytes received */
  316.     u_long    tcps_rcvpackafterwin;    /* packets with data after window */
  317.     u_long    tcps_rcvbyteafterwin;    /* bytes rcvd after window */
  318.     u_long    tcps_rcvafterclose;    /* packets rcvd after "close" */
  319.     u_long    tcps_rcvwinprobe;    /* rcvd window probe packets */
  320.     u_long    tcps_rcvdupack;        /* rcvd duplicate acks */
  321.     u_long    tcps_rcvacktoomuch;    /* rcvd acks for unsent data */
  322.     u_long    tcps_rcvackpack;    /* rcvd ack packets */
  323.     u_long    tcps_rcvackbyte;    /* bytes acked by rcvd acks */
  324.     u_long    tcps_rcvwinupd;        /* rcvd window update packets */
  325.     u_long    tcps_pawsdrop;        /* segments dropped due to PAWS */
  326.     u_long    tcps_predack;        /* times hdr predict ok for acks */
  327.     u_long    tcps_preddat;        /* times hdr predict ok for data pkts */
  328.     u_long    tcps_pcbcachemiss;
  329.     u_long    tcps_cachedrtt;        /* times cached RTT in route updated */
  330.     u_long    tcps_cachedrttvar;    /* times cached rttvar updated */
  331.     u_long    tcps_cachedssthresh;    /* times cached ssthresh updated */
  332.     u_long    tcps_usedrtt;        /* times RTT initialized from route */
  333.     u_long    tcps_usedrttvar;    /* times RTTVAR initialized from rt */
  334.     u_long    tcps_usedssthresh;    /* times ssthresh initialized from rt*/
  335.     u_long    tcps_persistdrop;    /* timeout in persist state */
  336.     u_long    tcps_badsyn;        /* bogus SYN, e.g. premature ACK */
  337.     u_long    tcps_mturesent;        /* resends due to MTU discovery */
  338.     u_long    tcps_listendrop;    /* listen queue overflows */
  339. };
  340.  
  341. /*
  342.  * TCB structure exported to user-land via sysctl(3).
  343.  * Evil hack: declare only if in_pcb.h and sys/socketvar.h have been
  344.  * included.  Not all of our clients do.
  345.  */
  346. #if defined(_NETINET_IN_PCB_H_) && defined(_SYS_SOCKETVAR_H_)
  347. struct    xtcpcb {
  348.     size_t    xt_len;
  349.     struct    inpcb    xt_inp;
  350.     struct    tcpcb    xt_tp;
  351.     struct    xsocket    xt_socket;
  352.     u_quad_t    xt_alignment_hack;
  353. };
  354. #endif
  355.  
  356. /*
  357.  * Names for TCP sysctl objects
  358.  */
  359. #define    TCPCTL_DO_RFC1323    1    /* use RFC-1323 extensions */
  360. #define    TCPCTL_DO_RFC1644    2    /* use RFC-1644 extensions */
  361. #define    TCPCTL_MSSDFLT        3    /* MSS default */
  362. #define TCPCTL_STATS        4    /* statistics (read-only) */
  363. #define    TCPCTL_RTTDFLT        5    /* default RTT estimate */
  364. #define    TCPCTL_KEEPIDLE        6    /* keepalive idle timer */
  365. #define    TCPCTL_KEEPINTVL    7    /* interval to send keepalives */
  366. #define    TCPCTL_SENDSPACE    8    /* send buffer space */
  367. #define    TCPCTL_RECVSPACE    9    /* receive buffer space */
  368. #define    TCPCTL_KEEPINIT        10    /* receive buffer space */
  369. #define    TCPCTL_PCBLIST        11    /* list of all outstanding PCBs */
  370. #define    TCPCTL_V6MSSDFLT    12    /* MSS default for IPv6 */
  371. #define TCPCTL_MAXID        13
  372.  
  373. #define TCPCTL_NAMES { \
  374.     { 0, 0 }, \
  375.     { "rfc1323", CTLTYPE_INT }, \
  376.     { "rfc1644", CTLTYPE_INT }, \
  377.     { "mssdflt", CTLTYPE_INT }, \
  378.     { "stats", CTLTYPE_STRUCT }, \
  379.     { "rttdflt", CTLTYPE_INT }, \
  380.     { "keepidle", CTLTYPE_INT }, \
  381.     { "keepintvl", CTLTYPE_INT }, \
  382.     { "sendspace", CTLTYPE_INT }, \
  383.     { "recvspace", CTLTYPE_INT }, \
  384.     { "keepinit", CTLTYPE_INT }, \
  385.     { "pcblist", CTLTYPE_STRUCT }, \
  386.     { "v6mssdflt", CTLTYPE_INT }, \
  387. }
  388.  
  389. #ifdef KERNEL
  390. #ifdef SYSCTL_DECL
  391. SYSCTL_DECL(_net_inet_tcp);
  392. #endif
  393.  
  394. extern    struct inpcbhead tcb;        /* head of queue of active tcpcb's */
  395. extern    struct inpcbinfo tcbinfo;
  396. extern    struct tcpstat tcpstat;    /* tcp statistics */
  397. extern    int tcp_mssdflt;    /* XXX */
  398. extern    int tcp_v6mssdflt;    /* XXX */
  399. extern    u_long tcp_now;        /* for RFC 1323 timestamps */
  400. extern    int tcp_delack_enabled;
  401.  
  402. void     tcp_canceltimers __P((struct tcpcb *));
  403. struct tcpcb *
  404.      tcp_close __P((struct tcpcb *));
  405. void     tcp_ctlinput __P((int, struct sockaddr *, void *));
  406. #if INET6
  407. struct ip6_hdr;
  408. void     tcp6_ctlinput __P((int, struct sockaddr *,void *));
  409. #endif
  410. int     tcp_ctloutput __P((struct socket *, struct sockopt *));
  411. struct tcpcb *
  412.      tcp_drop __P((struct tcpcb *, int));
  413. void     tcp_drain __P((void));
  414. void     tcp_fasttimo __P((void));
  415. struct rmxp_tao *
  416.      tcp_gettaocache __P((struct inpcb *));
  417. void     tcp_init __P((void));
  418. #if INET6
  419. void     tcp6_init __P((void));
  420. int     tcp6_input __P((struct mbuf **, int *, int));
  421. #endif /* INET6 */
  422. void     tcp_input __P((struct mbuf *, int));
  423. #if INET6
  424. void     tcp_mss __P((struct tcpcb *, int, int));
  425. int     tcp_mssopt __P((struct tcpcb *, int));
  426. #else /* INET6 */
  427. void     tcp_mss __P((struct tcpcb *, int));
  428. int     tcp_mssopt __P((struct tcpcb *));
  429. #endif /* INET6 */
  430.  
  431. void     tcp_mtudisc __P((struct inpcb *, int));
  432. struct tcpcb *
  433.      tcp_newtcpcb __P((struct inpcb *));
  434. int     tcp_output __P((struct tcpcb *));
  435. void     tcp_quench __P((struct inpcb *, int));
  436. #if INET6
  437. void     tcp_respond __P((struct tcpcb *, void *, struct tcphdr *,
  438.               struct mbuf *, tcp_seq, tcp_seq, int, int));
  439. #else /* INET6 */
  440. void     tcp_respond __P((struct tcpcb *, void *, struct tcphdr *,
  441.               struct mbuf *, tcp_seq, tcp_seq, int));
  442. #endif /* INET6 */
  443.  
  444. struct rtentry *
  445.      tcp_rtlookup __P((struct inpcb *));
  446. #if INET6
  447. struct rtentry *
  448.      tcp_rtlookup6 __P((struct inpcb *));
  449. #endif /* INET6 */
  450. void     tcp_setpersist __P((struct tcpcb *));
  451. void     tcp_slowtimo __P((void));
  452. struct tcptemp *
  453.      tcp_template __P((struct tcpcb *));
  454. struct tcpcb *
  455.      tcp_timers __P((struct tcpcb *, int));
  456. #if INET6
  457. void     tcp_trace __P((int, int, struct tcpcb *, void *, struct tcphdr *, 
  458.             int));
  459. #else
  460. void     tcp_trace __P((int, int, struct tcpcb *, struct ip *,
  461.             struct tcphdr *, int));
  462. #endif
  463.  
  464. #if INET6
  465. int     tcp_reass __P((struct tcpcb *, struct tcphdr *, int,
  466.         struct mbuf *, int));
  467. #else /* INET6 */
  468. int     tcp_reass __P((struct tcpcb *, struct tcphdr *, int, struct mbuf *));
  469. /* suppress INET6 only args */
  470. #define tcp_reass(x, y, z, t, i)        tcp_reass(x, y, z, t)
  471. #define tcp_mss(x, y, i)            tcp_mss(x, y)
  472. #define tcp_mssopt(x, i)            tcp_mssopt(x)
  473. #define tcp_respond(x, y, z, m, s1, s2, f, i)    tcp_respond(x, y, z, m, s1, \
  474.                                 s2, f)
  475.  
  476. #endif /* INET6 */
  477.  
  478. extern    struct pr_usrreqs tcp_usrreqs;
  479. #if INET6
  480. extern    struct pr_usrreqs tcp6_usrreqs;
  481. #endif /* INET6 */
  482. extern    u_long tcp_sendspace;
  483. extern    u_long tcp_recvspace;
  484. void        tcp_rndiss_init __P((void));
  485. tcp_seq        tcp_rndiss_next __P((void));
  486. u_int16_t    tcp_rndiss_encrypt __P((u_int16_t));
  487.  
  488.  
  489.  
  490. #endif /* KERNEL */
  491.  
  492. #endif /* _NETINET_TCP_VAR_H_ */
  493.