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_timer.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 /*      $OpenBSD: tcp_timer.h,v 1.19 2022/11/07 11:22:55 yasuoka 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.
   40  */
   41 #define TCPT_REXMT      0               /* retransmit */
   42 #define TCPT_PERSIST    1               /* retransmit persistence */
   43 #define TCPT_KEEP       2               /* keep alive */
   44 #define TCPT_2MSL       3               /* 2*msl quiet time timer */
   45 #define TCPT_REAPER     4               /* delayed cleanup timeout */
   46 #define TCPT_DELACK     5               /* delayed ack timeout */
   47 
   48 #define TCPT_NTIMERS    6
   49 
   50 /*
   51  * The TCPT_REXMT timer is used to force retransmissions.
   52  * The TCP has the TCPT_REXMT timer set whenever segments
   53  * have been sent for which ACKs are expected but not yet
   54  * received.  If an ACK is received which advances tp->snd_una,
   55  * then the retransmit timer is cleared (if there are no more
   56  * outstanding segments) or reset to the base value (if there
   57  * are more ACKs expected).  Whenever the retransmit timer goes off,
   58  * we retransmit one unacknowledged segment, and do a backoff
   59  * on the retransmit timer.
   60  *
   61  * The TCPT_PERSIST timer is used to keep window size information
   62  * flowing even if the window goes shut.  If all previous transmissions
   63  * have been acknowledged (so that there are no retransmissions in progress),
   64  * and the window is too small to bother sending anything, then we start
   65  * the TCPT_PERSIST timer.  When it expires, if the window is nonzero,
   66  * we go to transmit state.  Otherwise, at intervals send a single byte
   67  * into the peer's window to force him to update our window information.
   68  * We do this at most as often as TCPT_PERSMIN time intervals,
   69  * but no more frequently than the current estimate of round-trip
   70  * packet time.  The TCPT_PERSIST timer is cleared whenever we receive
   71  * a window update from the peer.
   72  *
   73  * The TCPT_KEEP timer is used to keep connections alive.  If an
   74  * connection is idle (no segments received) for TCPTV_KEEP_INIT amount of time,
   75  * but not yet established, then we drop the connection.  Once the connection
   76  * is established, if the connection is idle for TCPTV_KEEP_IDLE time
   77  * (and keepalives have been enabled on the socket), we begin to probe
   78  * the connection.  We force the peer to send us a segment by sending:
   79  *      <SEQ=SND.UNA-1><ACK=RCV.NXT><CTL=ACK>
   80  * This segment is (deliberately) outside the window, and should elicit
   81  * an ack segment in response from the peer.  If, despite the TCPT_KEEP
   82  * initiated segments we cannot elicit a response from a peer in TCPT_MAXIDLE
   83  * amount of time probing, then we drop the connection.
   84  */
   85 
   86 /*
   87  * Time constants.
   88  */
   89 #define TCPTV_MSL       30              /* max seg lifetime (hah!) */
   90 #define TCPTV_SRTTBASE  0               /* base roundtrip time;
   91                                            if 0, no idea yet */
   92 #define TCPTV_SRTTDFLT  TCP_TIME_MSEC(1500) /* assumed RTT if no info */
   93 
   94 #define TCPTV_PERSMIN   5               /* retransmit persistence */
   95 #define TCPTV_PERSMAX   60              /* maximum persist interval */
   96 
   97 #define TCPTV_KEEP_INIT 75              /* initial connect keep alive */
   98 #define TCPTV_KEEP_IDLE 120*60          /* dflt time before probing */
   99 #define TCPTV_KEEPINTVL 75              /* default probe interval */
  100 #define TCPTV_KEEPCNT   8               /* max probes before drop */
  101 
  102 #define TCPTV_MIN       TCP_TIME(1)     /* minimum allowable value */
  103 #define TCPTV_REXMTMAX  TCP_TIME(64)    /* max allowable REXMT value */
  104 
  105 #define TCP_LINGERTIME  120             /* linger at most 2 minutes */
  106 
  107 #define TCP_MAXRXTSHIFT 12              /* maximum retransmits */
  108 
  109 #define TCP_DELACK_MSECS 200            /* time to delay ACK */
  110 
  111 #ifdef  TCPTIMERS
  112 const char *tcptimers[TCPT_NTIMERS] =
  113     { "REXMT", "PERSIST", "KEEP", "2MSL", "REAPER", "DELACK" };
  114 #endif /* TCPTIMERS */
  115 
  116 /*
  117  * Init, arm, disarm, and test TCP timers.
  118  */
  119 #define TCP_TIMER_INIT(tp, timer)                                       \
  120         timeout_set_proc(&(tp)->t_timer[(timer)], tcp_timer_funcs[(timer)], tp)
  121 
  122 #define TCP_TIMER_ARM(tp, timer, msecs)                                 \
  123 do {                                                                    \
  124         SET((tp)->t_flags, TF_TIMER << (timer));                        \
  125         timeout_add_msec(&(tp)->t_timer[(timer)], (msecs));             \
  126 } while (0)
  127 
  128 #define TCP_TIMER_DISARM(tp, timer)                                     \
  129 do {                                                                    \
  130         CLR((tp)->t_flags, TF_TIMER << (timer));                        \
  131         timeout_del(&(tp)->t_timer[(timer)]);                           \
  132 } while (0)
  133 
  134 #define TCP_TIMER_ISARMED(tp, timer)                                    \
  135         ISSET((tp)->t_flags, TF_TIMER << (timer))
  136 
  137 /*
  138  * Force a time value to be in a certain range.
  139  */
  140 #define TCPT_RANGESET(tv, value, tvmin, tvmax)                          \
  141 do {                                                                    \
  142         (tv) = (value);                                                 \
  143         if ((tv) < (tvmin))                                             \
  144                 (tv) = (tvmin);                                         \
  145         else if ((tv) > (tvmax))                                        \
  146                 (tv) = (tvmax);                                         \
  147 } while (/* CONSTCOND */ 0)
  148 
  149 #ifdef _KERNEL
  150 typedef void (*tcp_timer_func_t)(void *);
  151 
  152 extern const tcp_timer_func_t tcp_timer_funcs[TCPT_NTIMERS];
  153 
  154 extern int tcp_delack_msecs;            /* delayed ACK timeout in millisecs */
  155 extern int tcptv_keep_init;
  156 extern int tcp_always_keepalive;        /* assume SO_KEEPALIVE is always set */
  157 extern int tcp_keepidle;                /* time before keepalive probes begin */
  158 extern int tcp_keepintvl;               /* time between keepalive probes */
  159 extern int tcp_maxidle;                 /* time to drop after starting probes */
  160 extern int tcp_ttl;                     /* time to live for TCP segs */
  161 extern int tcp_backoff[];
  162 
  163 void    tcp_timer_init(void);
  164 #endif /* _KERNEL */
  165 #endif /* _NETINET_TCP_TIMER_H_ */

Cache object: d6f9f5039ad10654830f84cc7c463a69


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