1/* 2 * Copyright (c) 2000-2014 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/* 29 * Copyright (c) 1982, 1986, 1993 30 * The Regents of the University of California. All rights reserved. 31 * 32 * Redistribution and use in source and binary forms, with or without 33 * modification, are permitted provided that the following conditions 34 * are met: 35 * 1. Redistributions of source code must retain the above copyright 36 * notice, this list of conditions and the following disclaimer. 37 * 2. Redistributions in binary form must reproduce the above copyright 38 * notice, this list of conditions and the following disclaimer in the 39 * documentation and/or other materials provided with the distribution. 40 * 3. All advertising materials mentioning features or use of this software 41 * must display the following acknowledgement: 42 * This product includes software developed by the University of 43 * California, Berkeley and its contributors. 44 * 4. Neither the name of the University nor the names of its contributors 45 * may be used to endorse or promote products derived from this software 46 * without specific prior written permission. 47 * 48 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 51 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 * SUCH DAMAGE. 59 * 60 * @(#)tcp_timer.h 8.1 (Berkeley) 6/10/93 61 * $FreeBSD: src/sys/netinet/tcp_timer.h,v 1.18 1999/12/29 04:41:03 peter Exp $ 62 */ 63 64#ifndef _NETINET_TCP_TIMER_H_ 65#define _NETINET_TCP_TIMER_H_ 66#include <sys/appleapiopts.h> 67 68#ifdef KERNEL 69#include <kern/thread_call.h> 70#endif /* KERNEL */ 71 72/* 73 * Definitions of the TCP timers. 74 */ 75#define TCPT_NTIMERS (TCPT_MAX + 1) 76 77/* Keep the external definition the same for binary compatibility */ 78#define TCPT_NTIMERS_EXT 4 79 80#define TCPT_REXMT 0 /* retransmit */ 81#define TCPT_PERSIST 1 /* retransmit persistence */ 82#define TCPT_KEEP 2 /* keep alive */ 83#define TCPT_2MSL 3 /* 2*msl quiet time timer */ 84#define TCPT_DELACK 4 /* delayed ack timer */ 85#if MPTCP 86#define TCPT_JACK_RXMT 5 /* retransmit timer for join ack */ 87#define TCPT_MAX 5 88#else /* MPTCP */ 89#define TCPT_MAX 4 90#endif /* !MPTCP */ 91#define TCPT_NONE (TCPT_MAX + 1) 92 93/* 94 * The TCPT_REXMT timer is used to force retransmissions. 95 * The TCP has the TCPT_REXMT timer set whenever segments 96 * have been sent for which ACKs are expected but not yet 97 * received. If an ACK is received which advances tp->snd_una, 98 * then the retransmit timer is cleared (if there are no more 99 * outstanding segments) or reset to the base value (if there 100 * are more ACKs expected). Whenever the retransmit timer goes off, 101 * we retransmit one unacknowledged segment, and do a backoff 102 * on the retransmit timer. 103 * 104 * The TCPT_PERSIST timer is used to keep window size information 105 * flowing even if the window goes shut. If all previous transmissions 106 * have been acknowledged (so that there are no retransmissions in progress), 107 * and the window is too small to bother sending anything, then we start 108 * the TCPT_PERSIST timer. When it expires, if the window is nonzero, 109 * we go to transmit state. Otherwise, at intervals send a single byte 110 * into the peer's window to force him to update our window information. 111 * We do this at most as often as TCPT_PERSMIN time intervals, 112 * but no more frequently than the current estimate of round-trip 113 * packet time. The TCPT_PERSIST timer is cleared whenever we receive 114 * a window update from the peer. 115 * 116 * The TCPT_KEEP timer is used to keep connections alive. If an 117 * connection is idle (no segments received) for TCPTV_KEEP_INIT amount of time, 118 * but not yet established, then we drop the connection. Once the connection 119 * is established, if the connection is idle for TCPTV_KEEP_IDLE time 120 * (and keepalives have been enabled on the socket), we begin to probe 121 * the connection. We force the peer to send us a segment by sending: 122 * <SEQ=SND.UNA-1><ACK=RCV.NXT><CTL=ACK> 123 * This segment is (deliberately) outside the window, and should elicit 124 * an ack segment in response from the peer. If, despite the TCPT_KEEP 125 * initiated segments we cannot elicit a response from a peer in TCPT_MAXIDLE 126 * amount of time probing, then we drop the connection. 127 */ 128 129#ifdef PRIVATE 130 131/* 132 * Time constants. 133 */ 134#define TCPTV_MSL ( 15*TCP_RETRANSHZ) /* max seg lifetime (hah!) */ 135#define TCPTV_SRTTBASE 0 /* base roundtrip time; 136 if 0, no idea yet */ 137#define TCPTV_RTOBASE ( 1*TCP_RETRANSHZ) /* assumed RTO if no info */ 138#define TCPTV_SRTTDFLT ( 1*TCP_RETRANSHZ) /* assumed RTT if no info */ 139 140#define TCPTV_PERSMIN ( 5*TCP_RETRANSHZ) /* retransmit persistence */ 141#define TCPTV_PERSMAX ( 60*TCP_RETRANSHZ) /* maximum persist interval */ 142 143#define TCPTV_KEEP_INIT ( 75*TCP_RETRANSHZ) /* initial connect keep alive */ 144#define TCPTV_KEEP_IDLE (120*60*TCP_RETRANSHZ) /* dflt time before probing */ 145#define TCPTV_KEEPINTVL ( 75*TCP_RETRANSHZ) /* default probe interval */ 146#define TCPTV_KEEPCNT 8 /* max probes before drop */ 147 148#define TCPTV_REXMTMAX ( 64*TCP_RETRANSHZ ) /* max allowable REXMT value */ 149#define TCPTV_REXMTMIN ( TCP_RETRANSHZ/33 ) /* min REXMT for non-local connections */ 150#define TCPTV_UNACKWIN ( TCP_RETRANSHZ/10 ) /* Window for counting rcv bytes to see if 151 ack-stretching can start (default 100 ms) */ 152#define TCPTV_MAXRCVIDLE (TCP_RETRANSHZ/5 ) /* Receiver idle time, avoid ack-stretching after that*/ 153#define TCPTV_RCVBUFIDLE (TCP_RETRANSHZ/2) /* Receiver idle time, for rcv socket buffer resizing */ 154 155/* No ack stretching during slow-start, until we see some packets. 156 * By the time the receiver gets 512 packets, the senders cwnd 157 * should open by a few hundred packets consdering the 158 * slow-start progression. 159 */ 160#define TCP_RCV_SS_PKTCOUNT 512 161 162#define TCPTV_TWTRUNC 8 /* RTO factor to truncate TW */ 163 164#define TCP_LINGERTIME 120 /* linger at most 2 minutes */ 165 166#define TCP_MAXRXTSHIFT 12 /* maximum retransmits */ 167 168#ifdef TCPTIMERS 169static char *tcptimers[] = 170 { "REXMT", "PERSIST", "KEEP", "2MSL" , "DELACK"}; 171#endif 172 173#ifdef KERNEL 174 175/* We consider persist, keep and 2msl as slow timers which can be coalesced 176 * at a higher granularity (500 ms). Rexmt and delayed ack are considered fast 177 * timers which fire in the order of 100ms. 178 * 179 * The following conditional is to check if a timer is one of the slow timers. This 180 * is fast and works well for now. If we add more slow timers for any reason, 181 * we may need to change this. 182 */ 183#define IS_TIMER_SLOW(ind) ((ind & 0x3) != 0) 184 185struct tcptimerlist; 186 187struct tcptimerentry { 188 LIST_ENTRY(tcptimerentry) le; /* links for timer list */ 189 uint32_t timer_start; /* tcp clock when the timer was started */ 190 uint16_t index; /* index of lowest timer that needs to run first */ 191 uint32_t runtime; /* deadline at which the first timer has to fire */ 192}; 193 194LIST_HEAD(timerlisthead, tcptimerentry); 195 196struct tcptimerlist { 197 struct timerlisthead lhead; /* head of the list of timer entries */ 198 lck_mtx_t *mtx; /* lock to protect the list */ 199 lck_attr_t *mtx_attr; /* mutex attributes */ 200 lck_grp_t *mtx_grp; /* mutex group definition */ 201 lck_grp_attr_t *mtx_grp_attr; /* mutex group attributes */ 202 uint32_t fast_quantum; /* minimum time quantum to coalesce fast timers */ 203 uint32_t slow_quantum; /* minimum time quantum to coalesce slow timers */ 204 thread_call_t call; /* call entry */ 205 uint32_t runtime; /* time at which this list is going to run */ 206 uint32_t entries; /* Number of entries on the list */ 207 uint32_t maxentries; /* Max number of entries at any time */ 208 209 /* Set desired mode when timer list running */ 210 boolean_t running; /* Set when timer list is being processed */ 211 boolean_t scheduled; /* Set when timer is scheduled */ 212#define TCP_TIMERLIST_FASTMODE 0x1 213#define TCP_TIMERLIST_SLOWMODE 0x2 214 uint32_t mode; /* Current mode, fast or slow */ 215 uint32_t pref_mode; /* Preferred mode set by a connection, fast or slow */ 216 uint32_t pref_offset; /* Preferred offset set by a connection */ 217 uint32_t idlegen; /* Number of times the list has been idle in fast mode */ 218 struct tcptimerentry *next_te; /* Store the next timer entry pointer to process */ 219 220}; 221 222#define TCP_FASTMODE_IDLEGEN_MAX 20 /* Approximately 2 seconds */ 223 224/* 225 * Minimum retransmit timeout is set to 30ms. We add a slop of 226 * 200 ms to the retransmit value to account for processing 227 * variance and delayed ack. This extra 200ms will help to avoid 228 * spurious retransmits by taking into consideration the receivers 229 * that wait for delayed ack timer instead of generating an ack 230 * for every two packets. 231 * 232 * On a local link, the minimum retransmit timeout is 100ms and 233 * variance is set to 0. This will make the sender a little bit more 234 * aggressive on local link. When the connection is not established yet, 235 * there is no need to add an extra 200ms to retransmit timeout because 236 * the initial value is high (1s) and delayed ack is not a problem in 237 * that case. 238 */ 239#define TCPTV_REXMTSLOP ( TCP_RETRANSHZ/5 ) /* rexmt slop allowed (200 ms) */ 240 241/* macro to decide when retransmit slop (described above) should be added */ 242#define TCP_ADD_REXMTSLOP(tp) (tp->t_state >= TCPS_ESTABLISHED) 243 244#define TCPT_RANGESET(tv, value, tvmin, tvmax, addslop) do { \ 245 (tv) = ((addslop) ? tcp_rexmt_slop : 0) + (value); \ 246 if ((uint32_t)(tv) < (uint32_t)(tvmin)) \ 247 (tv) = (tvmin); \ 248 else if ((uint32_t)(tv) > (uint32_t)(tvmax)) \ 249 (tv) = (tvmax); \ 250} while(0) 251 252#define TCP_CONN_KEEPIDLE(tp) \ 253 ((tp)->t_keepidle && \ 254 ((tp)->t_inpcb->inp_socket->so_options & SO_KEEPALIVE) ? \ 255 (tp)->t_keepidle : tcp_keepidle) 256#define TCP_CONN_KEEPINIT(tp) \ 257 (((tp)->t_keepinit > 0) ? (tp)->t_keepinit : tcp_keepinit) 258#define TCP_CONN_KEEPCNT(tp) \ 259 (((tp)->t_keepcnt > 0) ? (tp)->t_keepcnt : tcp_keepcnt) 260#define TCP_CONN_KEEPINTVL(tp) \ 261 (((tp)->t_keepintvl > 0) ? (tp)->t_keepintvl : tcp_keepintvl) 262#define TCP_CONN_MAXIDLE(tp) \ 263 (TCP_CONN_KEEPCNT(tp) * TCP_CONN_KEEPINTVL(tp)) 264 265/* Since we did not add rexmt slop for local connections, we should add 266 * it to idle timeout. Otherwise local connections will reach idle state 267 * quickly 268 */ 269#define TCP_IDLETIMEOUT(tp) \ 270 (((TCP_ADD_REXMTSLOP(tp)) ? 0 : tcp_rexmt_slop) + tp->t_rxtcur) 271 272TAILQ_HEAD(tcptailq, tcpcb); 273 274extern int tcp_keepinit; /* time to establish connection */ 275extern int tcp_keepidle; /* time before keepalive probes begin */ 276extern int tcp_keepintvl; /* time between keepalive probes */ 277extern int tcp_keepcnt; /* number of keepalives */ 278extern int tcp_delack; /* delayed ack timer */ 279extern int tcp_maxpersistidle; 280extern int tcp_msl; 281extern int tcp_ttl; /* time to live for TCP segs */ 282extern int tcp_backoff[]; 283extern int tcp_rexmt_slop; 284extern u_int32_t tcp_max_persist_timeout; /* Maximum persistence for Zero Window Probes */ 285 286#define OFFSET_FROM_START(tp, off) ((tcp_now + (off)) - (tp)->tentry.timer_start) 287 288#endif /* KERNEL */ 289#endif /* PRIVATE */ 290#endif /* !_NETINET_TCP_TIMER_H_ */ 291 292