Commit:     7b0eb22b1d3b049306813a4aaa52966650f7491c
Parent:     7487c48c4fd15d1e2542be1183b783562cfe10bc
Author:     Ilpo Järvinen <[EMAIL PROTECTED]>
AuthorDate: Wed Feb 21 23:03:35 2007 -0800
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Wed Apr 25 22:23:05 2007 -0700

    [TCP] FRTO: Use Disorder state during operation instead of Open
    Retransmission counter assumptions are to be changed. Forcing
    reason to do this exist: Using sysctl in check would be racy
    as soon as FRTO starts to ignore some ACKs (doing that in the
    following patches). Userspace may disable it at any moment
    giving nice oops if timing is right. frto_counter would be
    inaccessible from userspace, but with SACK enhanced FRTO
    retrans_out can include other than head, and possibly leaving
    it non-zero after spurious RTO, boom again.
    Luckily, solution seems rather simple: never go directly to Open
    state but use Disorder instead. This does not really change much,
    since TCP could anyway change its state to Disorder during FRTO
    using path tcp_fastretrans_alert -> tcp_try_to_open (e.g., when
    a SACK block makes ACK dubious). Besides, Disorder seems to be
    the state where TCP should be if not recovering (in Recovery or
    Loss state) while having some retransmissions in-flight (see
    tcp_try_to_open), which is exactly what happens with FRTO.
    Signed-off-by: Ilpo Järvinen <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
 net/ipv4/tcp_input.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 194e880..e806839 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -1286,7 +1286,8 @@ void tcp_enter_frto(struct sock *sk)
-       tcp_set_ca_state(sk, TCP_CA_Open);
+       tcp_set_ca_state(sk, TCP_CA_Disorder);
+       tp->high_seq = tp->snd_nxt;
        tp->frto_highmark = tp->snd_nxt;
        tp->frto_counter = 1;
@@ -2014,8 +2015,7 @@ tcp_fastretrans_alert(struct sock *sk, u32 prior_snd_una,
        /* E. Check state exit conditions. State can be terminated
         *    when high_seq is ACKed. */
        if (icsk->icsk_ca_state == TCP_CA_Open) {
-               if (!sysctl_tcp_frto)
-                       BUG_TRAP(tp->retrans_out == 0);
+               BUG_TRAP(tp->retrans_out == 0);
                tp->retrans_stamp = 0;
        } else if (!before(tp->snd_una, tp->high_seq)) {
                switch (icsk->icsk_ca_state) {
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to