aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_output.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r--net/ipv4/tcp_output.c7
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;