tcp_timer.c revision 534aa84173051cab039a0585eee5b5dd011b20b8
9eb499828dd875d229531b50d05f016b8a1f1dd9vboxsync * Copyright (c) 1982, 1986, 1988, 1990, 1993
365b40dec2ed01d9983d29e276e7431c5a4a9c18vboxsync * The Regents of the University of California. All rights reserved.
9eb499828dd875d229531b50d05f016b8a1f1dd9vboxsync * Redistribution and use in source and binary forms, with or without
9eb499828dd875d229531b50d05f016b8a1f1dd9vboxsync * modification, are permitted provided that the following conditions
9eb499828dd875d229531b50d05f016b8a1f1dd9vboxsync * 1. Redistributions of source code must retain the above copyright
9eb499828dd875d229531b50d05f016b8a1f1dd9vboxsync * notice, this list of conditions and the following disclaimer.
9eb499828dd875d229531b50d05f016b8a1f1dd9vboxsync * 2. Redistributions in binary form must reproduce the above copyright
9eb499828dd875d229531b50d05f016b8a1f1dd9vboxsync * notice, this list of conditions and the following disclaimer in the
9eb499828dd875d229531b50d05f016b8a1f1dd9vboxsync * documentation and/or other materials provided with the distribution.
9eb499828dd875d229531b50d05f016b8a1f1dd9vboxsync * 3. All advertising materials mentioning features or use of this software
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * must display the following acknowledgement:
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * This product includes software developed by the University of
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * California, Berkeley and its contributors.
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * 4. Neither the name of the University nor the names of its contributors
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * may be used to endorse or promote products derived from this software
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * without specific prior written permission.
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
8eb4989e815c8f374b965265ccf184d6ce17d9e8vboxsync * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
da6747c2419b9cea8b5e2c576a30a5de999a8ab3vboxsync * SUCH DAMAGE.
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * @(#)tcp_timer.c 8.1 (Berkeley) 6/10/93
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * tcp_timer.c,v 1.2 1994/08/02 07:49:10 davidg Exp
8eb4989e815c8f374b965265ccf184d6ce17d9e8vboxsync * Fast timeout routine for processing delayed acks
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * Tcp protocol timeout routine called every 500 ms.
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * Updates the timers in all active tcb's and
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * causes finite state machine actions if timers expire.
bbfc28b1a00ce00001b2ead074d47254bec3e5cfvboxsync register int i;
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * Search through tcb's and update active timers.
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync while (1) {
27efd9329f6a90f7cacf840031e5305f98975960vboxsync goto before_loop_ends; /*vvl:the same as continue in original code*/
27efd9329f6a90f7cacf840031e5305f98975960vboxsync for (i = 0; i < TCPT_NTIMERS; i++) {
8eb4989e815c8f374b965265ccf184d6ce17d9e8vboxsync tcp_iss += TCP_ISSINCR/PR_SLOWHZ; /* increment iss */
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync if ((int)tcp_iss < 0)
bbfc28b1a00ce00001b2ead074d47254bec3e5cfvboxsync * Cancel all timers for TCP tp.
9d473abea9a9b6597b2b20bedc950ba33a2e73a5vboxsync register int i;
20b950300ed7ebcdf78f414c3d98b20d010ff74fvboxsync for (i = 0; i < TCPT_NTIMERS; i++)
20b950300ed7ebcdf78f414c3d98b20d010ff74fvboxsync { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 };
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * TCP timer processing.
20b950300ed7ebcdf78f414c3d98b20d010ff74fvboxsynctcp_timers(PNATState pData, register struct tcpcb *tp, int timer)
9d473abea9a9b6597b2b20bedc950ba33a2e73a5vboxsync register int rexmt;
20b950300ed7ebcdf78f414c3d98b20d010ff74fvboxsync * 2 MSL timeout in shutdown went off. If we're closed but
8eb4989e815c8f374b965265ccf184d6ce17d9e8vboxsync * still waiting for peer to close and connection has been idle
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * too long, or if 2MSL time is up from TIME_WAIT, delete connection
17a9bf5bda28580b3163cf1e2fb8b13c356b5fb0vboxsync * control block. Otherwise, check again in a bit.
8eb4989e815c8f374b965265ccf184d6ce17d9e8vboxsync * Retransmission timer went off. Message has not
20b950300ed7ebcdf78f414c3d98b20d010ff74fvboxsync * been acked within retransmit interval. Back off
9d473abea9a9b6597b2b20bedc950ba33a2e73a5vboxsync * to a longer retransmit interval and retransmit one segment.
9d473abea9a9b6597b2b20bedc950ba33a2e73a5vboxsync * XXXXX If a packet has timed out, then remove all the queued
bcc2356dccf06ea3fdd1f3e4d4e62b04e95673d0vboxsync * packets for that session.
8eb4989e815c8f374b965265ccf184d6ce17d9e8vboxsync * This is a hack to suit our terminal server here at the uni of canberra
da6747c2419b9cea8b5e2c576a30a5de999a8ab3vboxsync * since they have trouble with zeroes... It usually lets them through
5b802b5e11fed6e163afca32e9118d2599d312fbvboxsync * unharmed, but under some conditions, it'll eat the zeros. If we
0b1397fff8b368cf5c2f3d8f5b312ed00114977dvboxsync * keep retransmitting it, it'll keep eating the zeroes, so we keep
5b802b5e11fed6e163afca32e9118d2599d312fbvboxsync * retransmitting, and eventually the connection dies...
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * (this only happens on incoming data)
bcc2356dccf06ea3fdd1f3e4d4e62b04e95673d0vboxsync * So, if we were gonna drop the connection from too many retransmits,
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * don't... instead halve the t_maxseg, which might break up the NULLs and
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * let them through
bbfc28b1a00ce00001b2ead074d47254bec3e5cfvboxsync * We tried our best, now the connection must die!
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * Set rxtshift to 6, which is still at the maximum
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * backoff time
702250abf86d6252cfbbff216d848d2c799548a4vboxsync rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift];
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * If losing, let the lower level know and try for
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * a better route. Also, if we backed off this far,
6be66de4257f4f564e35f7b8ee57a282e3cf3e96vboxsync * our srtt estimate is probably bogus. Clobber it
case TCPT_PERSIST:
case TCPT_KEEP:
goto dropit;
goto dropit;
#ifdef TCP_COMPAT_42
return (tp);