Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=94d3b1e586f6d4c7150501bde284c544ce99073c
Commit:     94d3b1e586f6d4c7150501bde284c544ce99073c
Parent:     43cc7380eced27ee9cafdf89fa32333dc3884e8b
Author:     Ryousei Takano <[EMAIL PROTECTED]>
AuthorDate: Fri Oct 26 04:27:59 2007 -0700
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Fri Oct 26 04:27:59 2007 -0700

    [TCP]: fix D-SACK cwnd handling
    
    In the current net-2.6 kernel, handling FLAG_DSACKING_ACK is broken.
    The flag is cleared to 1 just after FLAG_DSACKING_ACK is set.
    
            if (found_dup_sack)
                    flag |= FLAG_DSACKING_ACK;
        :
        flag = 1;
    
    To fix it, this patch introduces a part of the tcp_sacktag_state patch:
        http://marc.info/?l=linux-netdev&m=119210560431519&w=2
    
    Signed-off-by: Ryousei Takano <[EMAIL PROTECTED]>
    Signed-off-by: Ilpo Järvinen <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 net/ipv4/tcp_input.c |   12 +++++-------
 1 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 457697a..69d8c38 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -1248,6 +1248,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff 
*ack_skb, u32 prior_snd_
        int cached_fack_count;
        int i;
        int first_sack_index;
+       int force_one_sack;
 
        if (!tp->sacked_out) {
                if (WARN_ON(tp->fackets_out))
@@ -1272,18 +1273,18 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff 
*ack_skb, u32 prior_snd_
         * if the only SACK change is the increase of the end_seq of
         * the first block then only apply that SACK block
         * and use retrans queue hinting otherwise slowpath */
-       flag = 1;
+       force_one_sack = 1;
        for (i = 0; i < num_sacks; i++) {
                __be32 start_seq = sp[i].start_seq;
                __be32 end_seq = sp[i].end_seq;
 
                if (i == 0) {
                        if (tp->recv_sack_cache[i].start_seq != start_seq)
-                               flag = 0;
+                               force_one_sack = 0;
                } else {
                        if ((tp->recv_sack_cache[i].start_seq != start_seq) ||
                            (tp->recv_sack_cache[i].end_seq != end_seq))
-                               flag = 0;
+                               force_one_sack = 0;
                }
                tp->recv_sack_cache[i].start_seq = start_seq;
                tp->recv_sack_cache[i].end_seq = end_seq;
@@ -1295,7 +1296,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff 
*ack_skb, u32 prior_snd_
        }
 
        first_sack_index = 0;
-       if (flag)
+       if (force_one_sack)
                num_sacks = 1;
        else {
                int j;
@@ -1321,9 +1322,6 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff 
*ack_skb, u32 prior_snd_
                }
        }
 
-       /* clear flag as used for different purpose in following code */
-       flag = 0;
-
        /* Use SACK fastpath hint if valid */
        cached_skb = tp->fastpath_skb_hint;
        cached_fack_count = tp->fastpath_cnt_hint;
-
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