diff options
-rw-r--r-- | net/ipv4/tcp_input.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 3f2f09091bcf..125b4517f368 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -1178,10 +1178,18 @@ static void tcp_mark_lost_retrans(struct sock *sk) | |||
1178 | if (!(TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_RETRANS)) | 1178 | if (!(TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_RETRANS)) |
1179 | continue; | 1179 | continue; |
1180 | 1180 | ||
1181 | if (after(received_upto, ack_seq) && | 1181 | /* TODO: We would like to get rid of tcp_is_fack(tp) only |
1182 | (tcp_is_fack(tp) || | 1182 | * constraint here (see above) but figuring out that at |
1183 | !before(received_upto, | 1183 | * least tp->reordering SACK blocks reside between ack_seq |
1184 | ack_seq + tp->reordering * tp->mss_cache))) { | 1184 | * and received_upto is not easy task to do cheaply with |
1185 | * the available datastructures. | ||
1186 | * | ||
1187 | * Whether FACK should check here for tp->reordering segs | ||
1188 | * in-between one could argue for either way (it would be | ||
1189 | * rather simple to implement as we could count fack_count | ||
1190 | * during the walk and do tp->fackets_out - fack_count). | ||
1191 | */ | ||
1192 | if (after(received_upto, ack_seq)) { | ||
1185 | TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_RETRANS; | 1193 | TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_RETRANS; |
1186 | tp->retrans_out -= tcp_skb_pcount(skb); | 1194 | tp->retrans_out -= tcp_skb_pcount(skb); |
1187 | 1195 | ||