[TCP]: reno sacked_out count fix
From: "Angelo P. Castellani" <angelo.castellani+lkml@gmail.com> Using NewReno, if a sk_buff is timed out and is accounted as lost_out, it should also be removed from the sacked_out. This is necessary because recovery using NewReno fast retransmit could take up to a lot RTTs and the sk_buff RTO can expire without actually being really lost. left_out = sacked_out + lost_out in_flight = packets_out - left_out + retrans_out Using NewReno without this patch, on very large network losses, left_out becames bigger than packets_out + retrans_out (!!). For this reason unsigned integer in_flight overflows to 2^32 - something. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d8fd0a7316
commit
8872d8e1c4
|
@ -1662,6 +1662,8 @@ static void tcp_update_scoreboard(struct sock *sk, struct tcp_sock *tp)
|
||||||
if (!(TCP_SKB_CB(skb)->sacked&TCPCB_TAGBITS)) {
|
if (!(TCP_SKB_CB(skb)->sacked&TCPCB_TAGBITS)) {
|
||||||
TCP_SKB_CB(skb)->sacked |= TCPCB_LOST;
|
TCP_SKB_CB(skb)->sacked |= TCPCB_LOST;
|
||||||
tp->lost_out += tcp_skb_pcount(skb);
|
tp->lost_out += tcp_skb_pcount(skb);
|
||||||
|
if (IsReno(tp))
|
||||||
|
tcp_remove_reno_sacks(sk, tp, tcp_skb_pcount(skb) + 1);
|
||||||
|
|
||||||
/* clear xmit_retrans hint */
|
/* clear xmit_retrans hint */
|
||||||
if (tp->retransmit_skb_hint &&
|
if (tp->retransmit_skb_hint &&
|
||||||
|
|
Loading…
Reference in a new issue