|
@@ -2698,11 +2698,16 @@ static void tcp_process_loss(struct sock *sk, int flag, bool is_dupack)
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
bool recovered = !before(tp->snd_una, tp->high_seq);
|
|
bool recovered = !before(tp->snd_una, tp->high_seq);
|
|
|
|
|
|
|
|
+ if ((flag & FLAG_SND_UNA_ADVANCED) &&
|
|
|
|
+ tcp_try_undo_loss(sk, false))
|
|
|
|
+ return;
|
|
|
|
+
|
|
if (tp->frto) { /* F-RTO RFC5682 sec 3.1 (sack enhanced version). */
|
|
if (tp->frto) { /* F-RTO RFC5682 sec 3.1 (sack enhanced version). */
|
|
/* Step 3.b. A timeout is spurious if not all data are
|
|
/* Step 3.b. A timeout is spurious if not all data are
|
|
* lost, i.e., never-retransmitted data are (s)acked.
|
|
* lost, i.e., never-retransmitted data are (s)acked.
|
|
*/
|
|
*/
|
|
- if (tcp_try_undo_loss(sk, flag & FLAG_ORIG_SACK_ACKED))
|
|
|
|
|
|
+ if ((flag & FLAG_ORIG_SACK_ACKED) &&
|
|
|
|
+ tcp_try_undo_loss(sk, true))
|
|
return;
|
|
return;
|
|
|
|
|
|
if (after(tp->snd_nxt, tp->high_seq) &&
|
|
if (after(tp->snd_nxt, tp->high_seq) &&
|
|
@@ -2732,8 +2737,6 @@ static void tcp_process_loss(struct sock *sk, int flag, bool is_dupack)
|
|
else if (flag & FLAG_SND_UNA_ADVANCED)
|
|
else if (flag & FLAG_SND_UNA_ADVANCED)
|
|
tcp_reset_reno_sack(tp);
|
|
tcp_reset_reno_sack(tp);
|
|
}
|
|
}
|
|
- if (tcp_try_undo_loss(sk, false))
|
|
|
|
- return;
|
|
|
|
tcp_xmit_retransmit_queue(sk);
|
|
tcp_xmit_retransmit_queue(sk);
|
|
}
|
|
}
|
|
|
|
|