net: tcp: Remove the RETRAN flag
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 20 Jul 2017 15:46:46 +0000 (11:46 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 21 Jul 2017 15:56:27 +0000 (11:56 -0400)
Use tcb->snd.recovery instead.  RETRAN actually only applied to one pass
through update(), so I don't know what exactly it was doing.

Regarding the RTTM, we're not supposed to use ACKs from retrans.  The
RETRAN flag would do that for one update() call, but not for any others.
Using snd.recovery does the trick.

Note that we will get SACKs for new data (beyond recovery_pt) during
recovery, and these will not be used to adjust the RTT.  That's probably
fine, and overall better than the RETRAN flag.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/net/tcp.c

index 9a0e2a9..ecd6fb9 100644 (file)
@@ -117,12 +117,11 @@ enum {
        RTO_RETRANS_RECOVERY = 3,
        CWIND_SCALE = 10,       /* initial CWIND will be MSS * this */
 
        RTO_RETRANS_RECOVERY = 3,
        CWIND_SCALE = 10,       /* initial CWIND will be MSS * this */
 
-       FORCE = 1,
-       CLONE = 2,
-       RETRAN = 4,
-       ACTIVE = 8,
-       SYNACK = 16,
-       TSO = 32,
+       FORCE                   = 1 << 0,
+       CLONE                   = 1 << 1,
+       ACTIVE                  = 1 << 2,
+       SYNACK                  = 1 << 3,
+       TSO                             = 1 << 4,
 
        LOGAGAIN = 3,
        LOGDGAIN = 2,
 
        LOGAGAIN = 3,
        LOGDGAIN = 2,
@@ -2356,9 +2355,8 @@ void update(struct conv *s, Tcp * seg)
                 *  don't let us hangup if sending into a closed window and
                 *  we're still getting acks
                 */
                 *  don't let us hangup if sending into a closed window and
                 *  we're still getting acks
                 */
-               if ((tcb->flags & RETRAN) && tcb->snd.wnd == 0) {
+               if (tcb->snd.recovery && (tcb->snd.wnd == 0))
                        tcb->backedoff = MAXBACKMS / 4;
                        tcb->backedoff = MAXBACKMS / 4;
-               }
                return;
        }
        /* At this point, they have acked something new. (positive ack, ack > una).
                return;
        }
        /* At this point, they have acked something new. (positive ack, ack > una).
@@ -2409,7 +2407,7 @@ void update(struct conv *s, Tcp * seg)
        /* Adjust the timers according to the round trip time */
        if (tcb->rtt_timer.state == TcptimerON && seq_ge(seg->ack, tcb->rttseq)) {
                tcphalt(tpriv, &tcb->rtt_timer);
        /* Adjust the timers according to the round trip time */
        if (tcb->rtt_timer.state == TcptimerON && seq_ge(seg->ack, tcb->rttseq)) {
                tcphalt(tpriv, &tcb->rtt_timer);
-               if ((tcb->flags & RETRAN) == 0) {
+               if (!tcb->snd.recovery) {
                        tcb->backoff = 0;
                        tcb->backedoff = 0;
                        rtt = tcb->rtt_timer.start - tcb->rtt_timer.count;
                        tcb->backoff = 0;
                        tcb->backedoff = 0;
                        rtt = tcb->rtt_timer.start - tcb->rtt_timer.count;
@@ -2446,7 +2444,6 @@ done:
        else
                tcphalt(tpriv, &tcb->timer);
 
        else
                tcphalt(tpriv, &tcb->timer);
 
-       tcb->flags &= ~RETRAN;
        tcb->backoff = 0;
        tcb->backedoff = 0;
 }
        tcb->backoff = 0;
        tcb->backedoff = 0;
 }
@@ -3596,7 +3593,7 @@ void tcprxmit(struct conv *s)
 
        tcb = (Tcpctl *) s->ptcl;
 
 
        tcb = (Tcpctl *) s->ptcl;
 
-       tcb->flags |= RETRAN | FORCE;
+       tcb->flags |= FORCE;
        tcb->snd.rtx = tcb->snd.una;
        set_in_flight(tcb);
 
        tcb->snd.rtx = tcb->snd.una;
        set_in_flight(tcb);