diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r-- | 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 d65d17bb2a09..9df5b2a4da6e 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 | |||
692 | TCP_SKB_CB(buff)->end_seq = TCP_SKB_CB(skb)->end_seq; | 692 | TCP_SKB_CB(buff)->end_seq = TCP_SKB_CB(skb)->end_seq; |
693 | TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(buff)->seq; | 693 | TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(buff)->seq; |
694 | 694 | ||
695 | if (tp->sacked_out && (TCP_SKB_CB(skb)->seq == tp->highest_sack)) | ||
696 | tp->highest_sack = TCP_SKB_CB(buff)->seq; | ||
697 | |||
695 | /* PSH and FIN should only be set in the second packet. */ | 698 | /* PSH and FIN should only be set in the second packet. */ |
696 | flags = TCP_SKB_CB(skb)->flags; | 699 | flags = TCP_SKB_CB(skb)->flags; |
697 | TCP_SKB_CB(skb)->flags = flags & ~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH); | 700 | 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 | |||
1723 | /* Update sequence range on original skb. */ | 1726 | /* Update sequence range on original skb. */ |
1724 | TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(next_skb)->end_seq; | 1727 | TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(next_skb)->end_seq; |
1725 | 1728 | ||
1729 | if (WARN_ON(tp->sacked_out && | ||
1730 | (TCP_SKB_CB(next_skb)->seq == tp->highest_sack))) | ||
1731 | return; | ||
1732 | |||
1726 | /* Merge over control information. */ | 1733 | /* Merge over control information. */ |
1727 | flags |= TCP_SKB_CB(next_skb)->flags; /* This moves PSH/FIN etc. over */ | 1734 | flags |= TCP_SKB_CB(next_skb)->flags; /* This moves PSH/FIN etc. over */ |
1728 | TCP_SKB_CB(skb)->flags = flags; | 1735 | TCP_SKB_CB(skb)->flags = flags; |