diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
| -rw-r--r-- | net/ipv4/tcp_input.c | 16 | 
1 files changed, 9 insertions, 7 deletions
| diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 29222b964951..a7537c7bbd06 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -979,14 +979,19 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
| 979 | if (!before(TCP_SKB_CB(skb)->seq, end_seq)) | 979 | if (!before(TCP_SKB_CB(skb)->seq, end_seq)) | 
| 980 | break; | 980 | break; | 
| 981 | 981 | ||
| 982 | in_sack = !after(start_seq, TCP_SKB_CB(skb)->seq) && | ||
| 983 | !before(end_seq, TCP_SKB_CB(skb)->end_seq); | ||
| 984 | |||
| 982 | pcount = tcp_skb_pcount(skb); | 985 | pcount = tcp_skb_pcount(skb); | 
| 983 | 986 | ||
| 984 | if (pcount > 1 && | 987 | if (pcount > 1 && !in_sack && | 
| 985 | (after(start_seq, TCP_SKB_CB(skb)->seq) || | 988 | after(TCP_SKB_CB(skb)->end_seq, start_seq)) { | 
| 986 | before(end_seq, TCP_SKB_CB(skb)->end_seq))) { | ||
| 987 | unsigned int pkt_len; | 989 | unsigned int pkt_len; | 
| 988 | 990 | ||
| 989 | if (after(start_seq, TCP_SKB_CB(skb)->seq)) | 991 | in_sack = !after(start_seq, | 
| 992 | TCP_SKB_CB(skb)->seq); | ||
| 993 | |||
| 994 | if (!in_sack) | ||
| 990 | pkt_len = (start_seq - | 995 | pkt_len = (start_seq - | 
| 991 | TCP_SKB_CB(skb)->seq); | 996 | TCP_SKB_CB(skb)->seq); | 
| 992 | else | 997 | else | 
| @@ -999,9 +1004,6 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
| 999 | 1004 | ||
| 1000 | fack_count += pcount; | 1005 | fack_count += pcount; | 
| 1001 | 1006 | ||
| 1002 | in_sack = !after(start_seq, TCP_SKB_CB(skb)->seq) && | ||
| 1003 | !before(end_seq, TCP_SKB_CB(skb)->end_seq); | ||
| 1004 | |||
| 1005 | sacked = TCP_SKB_CB(skb)->sacked; | 1007 | sacked = TCP_SKB_CB(skb)->sacked; | 
| 1006 | 1008 | ||
| 1007 | /* Account D-SACK for retransmitted packet. */ | 1009 | /* Account D-SACK for retransmitted packet. */ | 
