root/netinet/tcp_timer.h

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

INCLUDED FROM


    1 /*      $OpenBSD: tcp_timer.h,v 1.10 2003/06/02 23:28:15 millert Exp $  */
    2 /*      $NetBSD: tcp_timer.h,v 1.6 1995/03/26 20:32:37 jtc Exp $        */
    3 
    4 /*
    5  * Copyright (c) 1982, 1986, 1993
    6  *      The Regents of the University of California.  All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  * 3. Neither the name of the University nor the names of its contributors
   17  *    may be used to endorse or promote products derived from this software
   18  *    without specific prior written permission.
   19  *
   20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   30  * SUCH DAMAGE.
   31  *
   32  *      @(#)tcp_timer.h 8.1 (Berkeley) 6/10/93
   33  */
   34 
   35 #ifndef _NETINET_TCP_TIMER_H_
   36 #define _NETINET_TCP_TIMER_H_
   37 
   38 /*
   39  * Definitions of the TCP timers.  These timers are counted
   40  * down PR_SLOWHZ times a second.
   41  */
   42 #define TCPT_NTIMERS    4
   43 
   44 #define TCPT_REXMT      0               /* retransmit */
   45 #define TCPT_PERSIST    1               /* retransmit persistance */
   46 #define TCPT_KEEP       2               /* keep alive */
   47 #define TCPT_2MSL       3               /* 2*msl quiet time timer */
   48 
   49 /*
   50  * The TCPT_REXMT timer is used to force retransmissions.
   51  * The TCP has the TCPT_REXMT timer set whenever segments
   52  * have been sent for which ACKs are expected but not yet
   53  * received.  If an ACK is received which advances tp->snd_una,
   54  * then the retransmit timer is cleared (if there are no more
   55  * outstanding segments) or reset to the base value (if there
   56  * are more ACKs expected).  Whenever the retransmit timer goes off,
   57  * we retransmit one unacknowledged segment, and do a backoff
   58  * on the retransmit timer.
   59  *
   60  * The TCPT_PERSIST timer is used to keep window size information
   61  * flowing even if the window goes shut.  If all previous transmissions
   62  * have been acknowledged (so that there are no retransmissions in progress),
   63  * and the window is too small to bother sending anything, then we start
   64  * the TCPT_PERSIST timer.  When it expires, if the window is nonzero,
   65  * we go to transmit state.  Otherwise, at intervals send a single byte
   66  * into the peer's window to force him to update our window information.
   67  * We do this at most as often as TCPT_PERSMIN time intervals,
   68  * but no more frequently than the current estimate of round-trip
   69  * packet time.  The TCPT_PERSIST timer is cleared whenever we receive
   70  * a window update from the peer.
   71  *
   72  * The TCPT_KEEP timer is used to keep connections alive.  If an
   73  * connection is idle (no segments received) for TCPTV_KEEP_INIT amount of time,
   74  * but not yet established, then we drop the connection.  Once the connection
   75  * is established, if the connection is idle for TCPTV_KEEP_IDLE time
   76  * (and keepalives have been enabled on the socket), we begin to probe
   77  * the connection.  We force the peer to send us a segment by sending:
   78  *      <SEQ=SND.UNA-1><ACK=RCV.NXT><CTL=ACK>
   79  * This segment is (deliberately) outside the window, and should elicit
   80  * an ack segment in response from the peer.  If, despite the TCPT_KEEP
   81  * initiated segments we cannot elicit a response from a peer in TCPT_MAXIDLE
   82  * amount of time probing, then we drop the connection.
   83  */
   84 
   85 /*
   86  * Time constants.
   87  */
   88 #define TCPTV_MSL       ( 30*PR_SLOWHZ)         /* max seg lifetime (hah!) */
   89 #define TCPTV_SRTTBASE  0                       /* base roundtrip time;
   90                                                    if 0, no idea yet */
   91 #define TCPTV_SRTTDFLT  (  3*PR_SLOWHZ)         /* assumed RTT if no info */
   92 
   93 #define TCPTV_PERSMIN   (  5*PR_SLOWHZ)         /* retransmit persistance */
   94 #define TCPTV_PERSMAX   ( 60*PR_SLOWHZ)         /* maximum persist interval */
   95 
   96 #define TCPTV_KEEP_INIT ( 75*PR_SLOWHZ)         /* initial connect keep alive */
   97 #define TCPTV_KEEP_IDLE (120*60*PR_SLOWHZ)      /* dflt time before probing */
   98 #define TCPTV_KEEPINTVL ( 75*PR_SLOWHZ)         /* default probe interval */
   99 #define TCPTV_KEEPCNT   8                       /* max probes before drop */
  100 
  101 #define TCPTV_MIN       (  1*PR_SLOWHZ)         /* minimum allowable value */
  102 #define TCPTV_REXMTMAX  ( 64*PR_SLOWHZ)         /* max allowable REXMT value */
  103 
  104 #define TCP_LINGERTIME  120                     /* linger at most 2 minutes */
  105 
  106 #define TCP_MAXRXTSHIFT 12                      /* maximum retransmits */
  107 
  108 #define TCP_DELACK_TICKS (hz / PR_FASTHZ)       /* time to delay ACK */
  109 
  110 #ifdef  TCPTIMERS
  111 const char *tcptimers[] =
  112     { "REXMT", "PERSIST", "KEEP", "2MSL" };
  113 #endif /* TCPTIMERS */
  114 
  115 /*
  116  * Init, arm, disarm, and test TCP timers.
  117  */
  118 #define TCP_TIMER_INIT(tp, timer)                                       \
  119         timeout_set(&(tp)->t_timer[(timer)], tcp_timer_funcs[(timer)], tp)
  120 
  121 #define TCP_TIMER_ARM(tp, timer, nticks)                                \
  122         timeout_add(&(tp)->t_timer[(timer)], (nticks) * (hz / PR_SLOWHZ))
  123 
  124 #define TCP_TIMER_DISARM(tp, timer)                                     \
  125         timeout_del(&(tp)->t_timer[(timer)])
  126 
  127 #define TCP_TIMER_ISARMED(tp, timer)                                    \
  128         timeout_pending(&(tp)->t_timer[(timer)])
  129 
  130 /*
  131  * Force a time value to be in a certain range.
  132  */
  133 #define TCPT_RANGESET(tv, value, tvmin, tvmax) { \
  134         (tv) = (value); \
  135         if ((tv) < (tvmin)) \
  136                 (tv) = (tvmin); \
  137         else if ((tv) > (tvmax)) \
  138                 (tv) = (tvmax); \
  139 }
  140 
  141 #ifdef _KERNEL
  142 typedef void (*tcp_timer_func_t)(void *);
  143 
  144 extern const tcp_timer_func_t tcp_timer_funcs[TCPT_NTIMERS];
  145 
  146 extern int tcptv_keep_init;
  147 extern int tcp_keepidle;                /* time before keepalive probes begin */
  148 extern int tcp_keepintvl;               /* time between keepalive probes */
  149 extern int tcp_maxidle;                 /* time to drop after starting probes */
  150 extern int tcp_ttl;                     /* time to live for TCP segs */
  151 extern int tcp_backoff[];
  152 
  153 void    tcp_timer_init(void);
  154 #endif /* _KERNEL */
  155 #endif /* _NETINET_TCP_TIMER_H_ */

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