git: 9bc48382a5e8 - stable/14 - tcp: move cc_post_recovery past snd_una update
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 05 Feb 2024 11:41:48 UTC
The branch stable/14 has been updated by rscheff:
URL: https://cgit.FreeBSD.org/src/commit/?id=9bc48382a5e8260b3240b4cd99d984ada55f0990
commit 9bc48382a5e8260b3240b4cd99d984ada55f0990
Author: Richard Scheffenegger <rscheff@FreeBSD.org>
AuthorDate: 2024-01-27 23:16:59 +0000
Commit: Richard Scheffenegger <rscheff@FreeBSD.org>
CommitDate: 2024-02-01 18:13:53 +0000
tcp: move cc_post_recovery past snd_una update
The RFC6675 pipe calculation (sack.revised, enabled
by default since D28702), uses outdated information,
while the previous default calculated it correctly
with up-to-date information from the incoming ACK.
This difference can become as large as the receive
window (not the congestion window previously),
potentially triggering a massive burst of new packets.
MFC after: 1 week
Reviewed By: tuexen, #transport
Sponsored by: NetApp, Inc.
Differential Revision: https://reviews.freebsd.org/D43520
(cherry picked from commit 0b3f9e435f2bde9e5be27030d9f574a977a1ad47)
---
sys/netinet/tcp_input.c | 57 ++++++++++++++++++++++++-------------------------
1 file changed, 28 insertions(+), 29 deletions(-)
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index 38498370ceb2..2a4f3875d1b9 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -478,13 +478,12 @@ cc_post_recovery(struct tcpcb *tp, struct tcphdr *th)
{
INP_WLOCK_ASSERT(tptoinpcb(tp));
- /* XXXLAS: KASSERT that we're in recovery? */
-
if (CC_ALGO(tp)->post_recovery != NULL) {
tp->t_ccv.curack = th->th_ack;
CC_ALGO(tp)->post_recovery(&tp->t_ccv);
}
- /* XXXLAS: EXIT_RECOVERY ? */
+ EXIT_RECOVERY(tp->t_flags);
+
tp->t_bytes_acked = 0;
tp->sackhint.delivered_data = 0;
tp->sackhint.prr_delivered = 0;
@@ -2803,35 +2802,36 @@ resume_partialack:
* If the congestion window was inflated to account
* for the other side's cached packets, retract it.
*/
- if (IN_FASTRECOVERY(tp->t_flags)) {
- if (SEQ_LT(th->th_ack, tp->snd_recover)) {
- if (tp->t_flags & TF_SACK_PERMIT)
- if (V_tcp_do_prr && to.to_flags & TOF_SACK) {
- tcp_timer_activate(tp, TT_REXMT, 0);
+ if (SEQ_LT(th->th_ack, tp->snd_recover)) {
+ if (IN_FASTRECOVERY(tp->t_flags)) {
+ if (tp->t_flags & TF_SACK_PERMIT) {
+ if (V_tcp_do_prr &&
+ (to.to_flags & TOF_SACK)) {
+ tcp_timer_activate(tp,
+ TT_REXMT, 0);
tp->t_rtttime = 0;
- tcp_do_prr_ack(tp, th, &to, sack_changed);
+ tcp_do_prr_ack(tp, th, &to,
+ sack_changed);
tp->t_flags |= TF_ACKNOW;
(void) tcp_output(tp);
- } else
+ } else {
tcp_sack_partialack(tp, th);
- else
+ }
+ } else {
tcp_newreno_partial_ack(tp, th);
- } else
- cc_post_recovery(tp, th);
- } else if (IN_CONGRECOVERY(tp->t_flags)) {
- if (SEQ_LT(th->th_ack, tp->snd_recover)) {
- if (V_tcp_do_prr) {
- tp->sackhint.delivered_data = BYTES_THIS_ACK(tp, th);
- tp->snd_fack = th->th_ack;
- /*
- * During ECN cwnd reduction
- * always use PRR-SSRB
- */
- tcp_do_prr_ack(tp, th, &to, SACK_CHANGE);
- (void) tcp_output(tp);
}
- } else
- cc_post_recovery(tp, th);
+ } else if (IN_CONGRECOVERY(tp->t_flags) &&
+ (V_tcp_do_prr)) {
+ tp->sackhint.delivered_data =
+ BYTES_THIS_ACK(tp, th);
+ tp->snd_fack = th->th_ack;
+ /*
+ * During ECN cwnd reduction
+ * always use PRR-SSRB
+ */
+ tcp_do_prr_ack(tp, th, &to, SACK_CHANGE);
+ (void) tcp_output(tp);
+ }
}
/*
* If we reach this point, ACK is not a duplicate,
@@ -2982,12 +2982,11 @@ process_ACK:
SEQ_GT(tp->snd_una, tp->snd_recover) &&
SEQ_LEQ(th->th_ack, tp->snd_recover))
tp->snd_recover = th->th_ack - 1;
- /* XXXLAS: Can this be moved up into cc_post_recovery? */
+ tp->snd_una = th->th_ack;
if (IN_RECOVERY(tp->t_flags) &&
SEQ_GEQ(th->th_ack, tp->snd_recover)) {
- EXIT_RECOVERY(tp->t_flags);
+ cc_post_recovery(tp, th);
}
- tp->snd_una = th->th_ack;
if (tp->t_flags & TF_SACK_PERMIT) {
if (SEQ_GT(tp->snd_una, tp->snd_recover))
tp->snd_recover = tp->snd_una;