Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=6408d206c7484615ecae54bf6474a02c94e9e862
Commit:     6408d206c7484615ecae54bf6474a02c94e9e862
Parent:     7b0eb22b1d3b049306813a4aaa52966650f7491c
Author:     Ilpo Järvinen <[EMAIL PROTECTED]>
AuthorDate: Wed Feb 21 23:04:11 2007 -0800
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Wed Apr 25 22:23:06 2007 -0700

    [TCP] FRTO: Ignore some uninteresting ACKs
    
    Handles RFC4138 shortcoming (in step 2); it should also have case
    c) which ignores ACKs that are not duplicates nor advance window
    (opposite dir data, winupdate).
    
    Signed-off-by: Ilpo Järvinen <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 net/ipv4/tcp_input.c |   13 ++++++++++---
 1 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index e806839..e990d56 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -2495,9 +2495,9 @@ static void tcp_conservative_spur_to_response(struct 
tcp_sock *tp)
 
 /* F-RTO spurious RTO detection algorithm (RFC4138)
  *
- * F-RTO affects during two new ACKs following RTO. State (ACK number) is kept
- * in frto_counter. When ACK advances window (but not to or beyond highest
- * sequence sent before RTO):
+ * F-RTO affects during two new ACKs following RTO (well, almost, see inline
+ * comments). State (ACK number) is kept in frto_counter. When ACK advances
+ * window (but not to or beyond highest sequence sent before RTO):
  *   On First ACK,  send two new segments out.
  *   On Second ACK, RTO was likely spurious. Do spurious response (response
  *                  algorithm is not part of the F-RTO detection algorithm
@@ -2527,6 +2527,13 @@ static void tcp_process_frto(struct sock *sk, u32 
prior_snd_una, int flag)
        if (flag&FLAG_DATA_ACKED)
                inet_csk(sk)->icsk_retransmits = 0;
 
+       /* RFC4138 shortcoming in step 2; should also have case c): ACK isn't
+        * duplicate nor advances window, e.g., opposite dir data, winupdate
+        */
+       if ((tp->snd_una == prior_snd_una) && (flag&FLAG_NOT_DUP) &&
+           !(flag&FLAG_FORWARD_PROGRESS))
+               return;
+
        if (tp->snd_una == prior_snd_una ||
            !before(tp->snd_una, tp->frto_highmark)) {
                tcp_enter_frto_loss(sk);
-
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  http://vger.kernel.org/majordomo-info.html

Reply via email to