/* SPDX-License-Identifier: BSD-3-Clause */
/*
 * Copyright (c) 1982, 1986, 1988, 1990, 1993
 *	The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *	@(#)tcp_timer.c	8.1 (Berkeley) 6/10/93
 * tcp_timer.c,v 1.2 1994/08/02 07:49:10 davidg Exp
 */

#include "slirp.h"

static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer);

/*
 * Fast timeout routine for processing delayed acks
 */
void tcp_fasttimo(Slirp *slirp)
{
    register struct socket *so;
    register struct tcpcb *tp;

    DEBUG_CALL("tcp_fasttimo");

    so = slirp->tcb.so_next;
    if (so)
        for (; so != &slirp->tcb; so = so->so_next)
            if ((tp = (struct tcpcb *)so->so_tcpcb) &&
                (tp->t_flags & TF_DELACK)) {
                tp->t_flags &= ~TF_DELACK;
                tp->t_flags |= TF_ACKNOW;
                tcp_output(tp);
            }
}

/*
 * Tcp protocol timeout routine called every 500 ms.
 * Updates the timers in all active tcb's and
 * causes finite state machine actions if timers expire.
 */
void tcp_slowtimo(Slirp *slirp)
{
    register struct socket *ip, *ipnxt;
    register struct tcpcb *tp;
    register int i;

    DEBUG_CALL("tcp_slowtimo");

    /*
     * Search through tcb's and update active timers.
     */
    ip = slirp->tcb.so_next;
    if (ip == NULL) {
        return;
    }
    for (; ip != &slirp->tcb; ip = ipnxt) {
        ipnxt = ip->so_next;
        tp = sototcpcb(ip);
        if (tp == NULL) {
            continue;
        }
        for (i = 0; i < TCPT_NTIMERS; i++) {
            if (tp->t_timer[i] && --tp->t_timer[i] == 0) {
                tcp_timers(tp, i);
                if (ipnxt->so_prev != ip)
                    goto tpgone;
            }
        }
        tp->t_idle++;
        if (tp->t_rtt)
            tp->t_rtt++;
    tpgone:;
    }
    slirp->tcp_iss += TCP_ISSINCR / PR_SLOWHZ; /* increment iss */
    slirp->tcp_now++; /* for timestamps */
}

void tcp_canceltimers(struct tcpcb *tp)
{
    register int i;

    for (i = 0; i < TCPT_NTIMERS; i++)
        tp->t_timer[i] = 0;
}

const int tcp_backoff[TCP_MAXRXTSHIFT + 1] = { 1,  2,  4,  8,  16, 32, 64,
                                               64, 64, 64, 64, 64, 64 };

/*
 * TCP timer processing.
 */
static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer)
{
    register int rexmt;

    DEBUG_CALL("tcp_timers");

    switch (timer) {
    /*
     * 2 MSL timeout in shutdown went off.  If we're closed but
     * still waiting for peer to close and connection has been idle
     * too long, or if 2MSL time is up from TIME_WAIT, delete connection
     * control block.  Otherwise, check again in a bit.
     */
    case TCPT_2MSL:
        if (tp->t_state != TCPS_TIME_WAIT && tp->t_idle <= TCP_MAXIDLE)
            tp->t_timer[TCPT_2MSL] = TCPTV_KEEPINTVL;
        else
            tp = tcp_close(tp);
        break;

    /*
     * Retransmission timer went off.  Message has not
     * been acked within retransmit interval.  Back off
     * to a longer retransmit interval and retransmit one segment.
     */
    case TCPT_REXMT:

        /*
         * XXXXX If a packet has timed out, then remove all the queued
         * packets for that session.
         */

        if (++tp->t_rxtshift > TCP_MAXRXTSHIFT) {
            /*
             * This is a hack to suit our terminal server here at the uni of
             * canberra since they have trouble with zeroes... It usually lets
             * them through unharmed, but under some conditions, it'll eat the
             * zeros.  If we keep retransmitting it, it'll keep eating the
             * zeroes, so we keep retransmitting, and eventually the connection
             * dies... (this only happens on incoming data)
             *
             * So, if we were gonna drop the connection from too many
             * retransmits, don't... instead halve the t_maxseg, which might
             * break up the NULLs and let them through
             *
             * *sigh*
             */

            tp->t_maxseg >>= 1;
            if (tp->t_maxseg < 32) {
                /*
                 * We tried our best, now the connection must die!
                 */
                tp->t_rxtshift = TCP_MAXRXTSHIFT;
                tp = tcp_drop(tp, tp->t_softerror);
                /* tp->t_softerror : ETIMEDOUT); */ /* XXX */
                return (tp); /* XXX */
            }

            /*
             * Set rxtshift to 6, which is still at the maximum
             * backoff time
             */
            tp->t_rxtshift = 6;
        }
        rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift];
        TCPT_RANGESET(tp->t_rxtcur, rexmt, (short)tp->t_rttmin,
                      TCPTV_REXMTMAX); /* XXX */
        tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;
        /*
         * If losing, let the lower level know and try for
         * a better route.  Also, if we backed off this far,
         * our srtt estimate is probably bogus.  Clobber it
         * so we'll take the next rtt measurement as our srtt;
         * move the current srtt into rttvar to keep the current
         * retransmit times until then.
         */
        if (tp->t_rxtshift > TCP_MAXRXTSHIFT / 4) {
            tp->t_rttvar += (tp->t_srtt >> TCP_RTT_SHIFT);
            tp->t_srtt = 0;
        }
        tp->snd_nxt = tp->snd_una;
        /*
         * If timing a segment in this window, stop the timer.
         */
        tp->t_rtt = 0;
        /*
         * Close the congestion window down to one segment
         * (we'll open it by one segment for each ack we get).
         * Since we probably have a window's worth of unacked
         * data accumulated, this "slow start" keeps us from
         * dumping all that data as back-to-back packets (which
         * might overwhelm an intermediate gateway).
         *
         * There are two phases to the opening: Initially we
         * open by one mss on each ack.  This makes the window
         * size increase exponentially with time.  If the
         * window is larger than the path can handle, this
         * exponential growth results in dropped packet(s)
         * almost immediately.  To get more time between
         * drops but still "push" the network to take advantage
         * of improving conditions, we switch from exponential
         * to linear window opening at some threshold size.
         * For a threshold, we use half the current window
         * size, truncated to a multiple of the mss.
         *
         * (the minimum cwnd that will give us exponential
         * growth is 2 mss.  We don't allow the threshold
         * to go below this.)
         */
        {
            unsigned win = MIN(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->t_maxseg;
            if (win < 2)
                win = 2;
            tp->snd_cwnd = tp->t_maxseg;
            tp->snd_ssthresh = win * tp->t_maxseg;
            tp->t_dupacks = 0;
        }
        tcp_output(tp);
        break;

    /*
     * Persistence timer into zero window.
     * Force a byte to be output, if possible.
     */
    case TCPT_PERSIST:
        tcp_setpersist(tp);
        tp->t_force = 1;
        tcp_output(tp);
        tp->t_force = 0;
        break;

    /*
     * Keep-alive timer went off; send something
     * or drop connection if idle for too long.
     */
    case TCPT_KEEP:
        if (tp->t_state < TCPS_ESTABLISHED)
            goto dropit;

        if (slirp_do_keepalive && tp->t_state <= TCPS_CLOSE_WAIT) {
            if (tp->t_idle >= TCPTV_KEEP_IDLE + TCP_MAXIDLE)
                goto dropit;
            /*
             * Send a packet designed to force a response
             * if the peer is up and reachable:
             * either an ACK if the connection is still alive,
             * or an RST if the peer has closed the connection
             * due to timeout or reboot.
             * Using sequence number tp->snd_una-1
             * causes the transmitted zero-length segment
             * to lie outside the receive window;
             * by the protocol spec, this requires the
             * correspondent TCP to respond.
             */
            tcp_respond(tp, &tp->t_template, (struct mbuf *)NULL, tp->rcv_nxt,
                        tp->snd_una - 1, 0, tp->t_socket->so_ffamily);
            tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL;
        } else
            tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_IDLE;
        break;

    dropit:
        tp = tcp_drop(tp, 0);
        break;
    }

    return (tp);
}
