|
@@ -1403,8 +1403,16 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb,
|
|
|
|
|
|
BUG_ON(!pcount);
|
|
|
|
|
|
- /* Adjust hint for FACK. Non-FACK is handled in tcp_sacktag_one(). */
|
|
|
- if (tcp_is_fack(tp) && (skb == tp->lost_skb_hint))
|
|
|
+ /* Adjust counters and hints for the newly sacked sequence
|
|
|
+ * range but discard the return value since prev is already
|
|
|
+ * marked. We must tag the range first because the seq
|
|
|
+ * advancement below implicitly advances
|
|
|
+ * tcp_highest_sack_seq() when skb is highest_sack.
|
|
|
+ */
|
|
|
+ tcp_sacktag_one(sk, state, TCP_SKB_CB(skb)->sacked,
|
|
|
+ start_seq, end_seq, dup_sack, pcount);
|
|
|
+
|
|
|
+ if (skb == tp->lost_skb_hint)
|
|
|
tp->lost_cnt_hint += pcount;
|
|
|
|
|
|
TCP_SKB_CB(prev)->end_seq += shifted;
|
|
@@ -1430,12 +1438,6 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb,
|
|
|
skb_shinfo(skb)->gso_type = 0;
|
|
|
}
|
|
|
|
|
|
- /* Adjust counters and hints for the newly sacked sequence range but
|
|
|
- * discard the return value since prev is already marked.
|
|
|
- */
|
|
|
- tcp_sacktag_one(sk, state, TCP_SKB_CB(skb)->sacked,
|
|
|
- start_seq, end_seq, dup_sack, pcount);
|
|
|
-
|
|
|
/* Difference in this won't matter, both ACKed by the same cumul. ACK */
|
|
|
TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS);
|
|
|
|