|
@@ -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;
|