|
@@ -979,14 +979,19 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
|
|
|
if (!before(TCP_SKB_CB(skb)->seq, end_seq))
|
|
|
break;
|
|
|
|
|
|
+ in_sack = !after(start_seq, TCP_SKB_CB(skb)->seq) &&
|
|
|
+ !before(end_seq, TCP_SKB_CB(skb)->end_seq);
|
|
|
+
|
|
|
pcount = tcp_skb_pcount(skb);
|
|
|
|
|
|
- if (pcount > 1 &&
|
|
|
- (after(start_seq, TCP_SKB_CB(skb)->seq) ||
|
|
|
- before(end_seq, TCP_SKB_CB(skb)->end_seq))) {
|
|
|
+ if (pcount > 1 && !in_sack &&
|
|
|
+ after(TCP_SKB_CB(skb)->end_seq, start_seq)) {
|
|
|
unsigned int pkt_len;
|
|
|
|
|
|
- if (after(start_seq, TCP_SKB_CB(skb)->seq))
|
|
|
+ in_sack = !after(start_seq,
|
|
|
+ TCP_SKB_CB(skb)->seq);
|
|
|
+
|
|
|
+ if (!in_sack)
|
|
|
pkt_len = (start_seq -
|
|
|
TCP_SKB_CB(skb)->seq);
|
|
|
else
|
|
@@ -999,9 +1004,6 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
|
|
|
|
|
|
fack_count += pcount;
|
|
|
|
|
|
- in_sack = !after(start_seq, TCP_SKB_CB(skb)->seq) &&
|
|
|
- !before(end_seq, TCP_SKB_CB(skb)->end_seq);
|
|
|
-
|
|
|
sacked = TCP_SKB_CB(skb)->sacked;
|
|
|
|
|
|
/* Account D-SACK for retransmitted packet. */
|