Commit:     0dde7b5404a3d52dcd9ce66d46197f6c3ca97dda
Parent:     1a09404a2338163f181d170c7abdc2242b6c6f03
Author:     Ilpo Järvinen <[EMAIL PROTECTED]>
AuthorDate: Thu Sep 20 11:28:05 2007 -0700
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Wed Oct 10 16:52:08 2007 -0700

    [TCP]: Maintain highest_sack accurately to the highest skb
    In general, it should not be necessary to call tcp_fragment for
    already SACKed skbs, but it's better to be safe than sorry. And
    indeed, it can be called from sacktag when a DSACK arrives or
    some ACK (with SACK) reordering occurs (sacktag could be made
    to avoid the call in the latter case though I'm not sure if it's
    worth of the trouble and added complexity to cover such marginal
    The collapse case has return for SACKED_ACKED case earlier, so
    just WARN_ON if internal inconsistency is detected for some
    Signed-off-by: Ilpo Järvinen <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
 net/ipv4/tcp_output.c |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index d65d17b..9df5b2a 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -692,6 +692,9 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 
len, unsigned int mss
        TCP_SKB_CB(buff)->end_seq = TCP_SKB_CB(skb)->end_seq;
        TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(buff)->seq;
+       if (tp->sacked_out && (TCP_SKB_CB(skb)->seq == tp->highest_sack))
+               tp->highest_sack = TCP_SKB_CB(buff)->seq;
        /* PSH and FIN should only be set in the second packet. */
        flags = TCP_SKB_CB(skb)->flags;
        TCP_SKB_CB(skb)->flags = flags & ~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH);
@@ -1723,6 +1726,10 @@ static void tcp_retrans_try_collapse(struct sock *sk, 
struct sk_buff *skb, int m
                /* Update sequence range on original skb. */
                TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(next_skb)->end_seq;
+               if (WARN_ON(tp->sacked_out &&
+                   (TCP_SKB_CB(next_skb)->seq == tp->highest_sack)))
+                       return;
                /* Merge over control information. */
                flags |= TCP_SKB_CB(next_skb)->flags; /* This moves PSH/FIN 
etc. over */
                TCP_SKB_CB(skb)->flags = flags;
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