aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv4/tcp_input.c16
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