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