|
@@ -1106,7 +1106,7 @@ static bool tcp_check_dsack(struct sock *sk, const struct sk_buff *ack_skb,
|
|
|
}
|
|
|
|
|
|
/* D-SACK for already forgotten data... Do dumb counting. */
|
|
|
- if (dup_sack && tp->undo_marker && tp->undo_retrans &&
|
|
|
+ if (dup_sack && tp->undo_marker && tp->undo_retrans > 0 &&
|
|
|
!after(end_seq_0, prior_snd_una) &&
|
|
|
after(end_seq_0, tp->undo_marker))
|
|
|
tp->undo_retrans--;
|
|
@@ -1187,7 +1187,7 @@ static u8 tcp_sacktag_one(struct sock *sk,
|
|
|
|
|
|
/* Account D-SACK for retransmitted packet. */
|
|
|
if (dup_sack && (sacked & TCPCB_RETRANS)) {
|
|
|
- if (tp->undo_marker && tp->undo_retrans &&
|
|
|
+ if (tp->undo_marker && tp->undo_retrans > 0 &&
|
|
|
after(end_seq, tp->undo_marker))
|
|
|
tp->undo_retrans--;
|
|
|
if (sacked & TCPCB_SACKED_ACKED)
|
|
@@ -1893,7 +1893,7 @@ static void tcp_clear_retrans_partial(struct tcp_sock *tp)
|
|
|
tp->lost_out = 0;
|
|
|
|
|
|
tp->undo_marker = 0;
|
|
|
- tp->undo_retrans = 0;
|
|
|
+ tp->undo_retrans = -1;
|
|
|
}
|
|
|
|
|
|
void tcp_clear_retrans(struct tcp_sock *tp)
|
|
@@ -2665,7 +2665,7 @@ static void tcp_enter_recovery(struct sock *sk, bool ece_ack)
|
|
|
|
|
|
tp->prior_ssthresh = 0;
|
|
|
tp->undo_marker = tp->snd_una;
|
|
|
- tp->undo_retrans = tp->retrans_out;
|
|
|
+ tp->undo_retrans = tp->retrans_out ? : -1;
|
|
|
|
|
|
if (inet_csk(sk)->icsk_ca_state < TCP_CA_CWR) {
|
|
|
if (!ece_ack)
|