1*23195Smckusick /* 2*23195Smckusick * Copyright (c) 1982 Regents of the University of California. 3*23195Smckusick * All rights reserved. The Berkeley software License Agreement 4*23195Smckusick * specifies the terms and conditions for redistribution. 5*23195Smckusick * 6*23195Smckusick * @(#)tcp_timer.h 6.3 (Berkeley) 06/08/85 7*23195Smckusick */ 85125Swnj 95125Swnj /* 105125Swnj * Definitions of the TCP timers. These timers are counted 115125Swnj * down PR_SLOWHZ times a second. 125125Swnj */ 139860Ssam #define TCPT_NTIMERS 4 145125Swnj 155125Swnj #define TCPT_REXMT 0 /* retransmit */ 165165Swnj #define TCPT_PERSIST 1 /* retransmit persistance */ 175165Swnj #define TCPT_KEEP 2 /* keep alive */ 185165Swnj #define TCPT_2MSL 3 /* 2*msl quiet time timer */ 195125Swnj 205165Swnj /* 215165Swnj * The TCPT_REXMT timer is used to force retransmissions. 225165Swnj * The TCP has the TCPT_REXMT timer set whenever segments 235165Swnj * have been sent for which ACKs are expected but not yet 245165Swnj * received. If an ACK is received which advances tp->snd_una, 255165Swnj * then the retransmit timer is cleared (if there are no more 265165Swnj * outstanding segments) or reset to the base value (if there 275165Swnj * are more ACKs expected). Whenever the retransmit timer goes off, 285165Swnj * we retransmit all unacknowledged segments, and do an exponential 295165Swnj * backoff on the retransmit timer. 305165Swnj * 315165Swnj * The TCPT_PERSIST timer is used to keep window size information 327041Swnj * flowing even if the window goes shut. If all previous transmissions 337041Swnj * have been acknowledged (so that there are no retransmissions in progress), 347041Swnj * and the window is shut, then we start the TCPT_PERSIST timer, and at 357041Swnj * intervals send a single byte into the peers window to force him to update 365165Swnj * our window information. We do this at most as often as TCPT_PERSMIN 375165Swnj * time intervals, but no more frequently than the current estimate of 385165Swnj * round-trip packet time. The TCPT_PERSIST timer is cleared whenever 395165Swnj * we receive a window update from the peer. 405165Swnj * 415165Swnj * The TCPT_KEEP timer is used to keep connections alive. If an 425165Swnj * connection is idle (no segments received) for TCPTV_KEEP amount of time, 435165Swnj * but not yet established, then we drop the connection. If the connection 445165Swnj * is established, then we force the peer to send us a segment by sending: 455165Swnj * <SEQ=SND.UNA-1><ACK=RCV.NXT><CTL=ACK> 465165Swnj * This segment is (deliberately) outside the window, and should elicit 475165Swnj * an ack segment in response from the peer. If, despite the TCPT_KEEP 485165Swnj * initiated segments we cannot elicit a response from a peer in TCPT_MAXIDLE 495165Swnj * amount of time, then we drop the connection. 505165Swnj */ 515165Swnj 525245Sroot #define TCP_TTL 15 /* time to live for TCP segs */ 535125Swnj /* 545165Swnj * Time constants. 555125Swnj */ 565245Sroot #define TCPTV_MSL ( 30*PR_SLOWHZ) /* max seg lifetime */ 5718647Skarels #define TCPTV_SRTTBASE 0 /* base roundtrip time; 5818647Skarels if 0, no idea yet */ 597041Swnj #define TCPTV_KEEP ( 45*PR_SLOWHZ) /* keep alive - 45 secs */ 605165Swnj #define TCPTV_PERSMIN ( 5*PR_SLOWHZ) /* retransmit persistance */ 615125Swnj 627041Swnj #define TCPTV_MAXIDLE ( 8*TCPTV_KEEP) /* maximum allowable idle 635165Swnj time before drop conn */ 645125Swnj 655165Swnj #define TCPTV_MIN ( 1*PR_SLOWHZ) /* minimum allowable value */ 665392Swnj #define TCPTV_MAX ( 30*PR_SLOWHZ) /* maximum allowable value */ 675125Swnj 685392Swnj #define TCP_LINGERTIME 120 /* linger at most 2 minutes */ 695392Swnj 705691Swnj #define TCP_MAXRXTSHIFT 10 /* maximum retransmits */ 715691Swnj 725125Swnj #ifdef TCPTIMERS 735125Swnj char *tcptimers[] = 749860Ssam { "REXMT", "PERSIST", "KEEP", "2MSL" }; 755125Swnj #endif 765165Swnj 775165Swnj /* 785165Swnj * Retransmission smoothing constants. 795165Swnj * Smoothed round trip time is updated by 805165Swnj * tp->t_srtt = (tcp_alpha * tp->t_srtt) + ((1 - tcp_alpha) * tp->t_rtt) 815165Swnj * each time a new value of tp->t_rtt is available. The initial 825165Swnj * retransmit timeout is then based on 835165Swnj * tp->t_timer[TCPT_REXMT] = tcp_beta * tp->t_srtt; 845165Swnj * limited, however to be at least TCPTV_REXMTLO and at most TCPTV_REXMTHI. 855165Swnj */ 865165Swnj float tcp_alpha, tcp_beta; 875165Swnj 885165Swnj /* 895165Swnj * Initial values of tcp_alpha and tcp_beta. 905165Swnj * These are conservative: averaging over a long 915165Swnj * period of time, and allowing for large individual deviations from 925165Swnj * tp->t_srtt. 935165Swnj */ 945165Swnj #define TCP_ALPHA 0.9 955165Swnj #define TCP_BETA 2.0 965165Swnj 975165Swnj /* 985165Swnj * Force a time value to be in a certain range. 995165Swnj */ 1005245Sroot #define TCPT_RANGESET(tv, value, tvmin, tvmax) { \ 1015165Swnj (tv) = (value); \ 1025165Swnj if ((tv) < (tvmin)) \ 1035165Swnj (tv) = (tvmin); \ 1045165Swnj if ((tv) > (tvmax)) \ 1055245Sroot (tv) = (tvmax); \ 1065245Sroot } 107