Commit:     e317f6f69cb95527799d308a9421b7dc1252989a
Parent:     e01f9d7793be82e6c252efbd52c399d3eb65abe4
Author:     Ilpo Järvinen <[EMAIL PROTECTED]>
AuthorDate: Fri Mar 2 13:34:19 2007 -0800
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Wed Apr 25 22:23:26 2007 -0700

    [TCP]: FRTO undo response falls back to ratehalving one if ECEd
    Undoing ssthresh is disabled in fastretrans_alert whenever
    FLAG_ECE is set by clearing prior_ssthresh. The clearing does
    not protect FRTO because FRTO operates before fastretrans_alert.
    Moving the clearing of prior_ssthresh earlier seems to be a
    suboptimal solution to the FRTO case because then FLAG_ECE will
    cause a second ssthresh reduction in try_to_open (the first
    occurred when FRTO was entered). So instead, FRTO falls back
    immediately to the rate halving response, which switches TCP to
    CA_CWR state preventing the latter reduction of ssthresh.
    If the first ECE arrived before the ACK after which FRTO is able
    to decide RTO as spurious, prior_ssthresh is already cleared.
    Thus no undoing for ssthresh occurs. Besides, FLAG_ECE should be
    set also in the following ACKs resulting in rate halving response
    that sees TCP is already in CA_CWR, which again prevents an extra
    ssthresh reduction on that round-trip.
    If the first ECE arrived before RTO, ssthresh has already been
    adapted and prior_ssthresh remains cleared on entry because TCP
    is in CA_CWR (the same applies also to a case where FRTO is
    entered more than once and ECE comes in the middle).
    High_seq must not be touched after tcp_enter_cwr because CWR
    round-trip calculation depends on it.
    I believe that after this patch, FRTO should be ECN-safe and
    even able to take advantage of synergy benefits.
    Signed-off-by: Ilpo Järvinen <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
 net/ipv4/tcp_input.c |   11 ++++++-----
 1 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index cb715ea..d894bbc 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -2587,14 +2587,15 @@ static void tcp_conservative_spur_to_response(struct 
tcp_sock *tp)
 static void tcp_ratehalving_spur_to_response(struct sock *sk)
-       struct tcp_sock *tp = tcp_sk(sk);
        tcp_enter_cwr(sk, 0);
-       tp->high_seq = tp->frto_highmark;       /* Smoother w/o this? - ij */
-static void tcp_undo_spur_to_response(struct sock *sk)
+static void tcp_undo_spur_to_response(struct sock *sk, int flag)
-       tcp_undo_cwr(sk, 1);
+       if (flag&FLAG_ECE)
+               tcp_ratehalving_spur_to_response(sk);
+       else
+               tcp_undo_cwr(sk, 1);
 /* F-RTO spurious RTO detection algorithm (RFC4138)
@@ -2681,7 +2682,7 @@ static int tcp_process_frto(struct sock *sk, u32 
prior_snd_una, int flag)
        } else /* frto_counter == 2 */ {
                switch (sysctl_tcp_frto_response) {
                case 2:
-                       tcp_undo_spur_to_response(sk);
+                       tcp_undo_spur_to_response(sk, flag);
                case 1:
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