The branch main has been updated by cc:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=67787d200488f0d838b20b0f483d1ca08ff6c014

commit 67787d200488f0d838b20b0f483d1ca08ff6c014
Author:     Cheng Cui <c...@freebsd.org>
AuthorDate: 2025-02-21 20:53:06 +0000
Commit:     Cheng Cui <c...@freebsd.org>
CommitDate: 2025-02-28 20:53:12 +0000

    tcp: make inflight data (pipe) calculation consistent
    
    Reviewed by: glebius, rrs, tuexen
    Differential Revision: https://reviews.freebsd.org/D49047
---
 sys/netinet/cc/cc.c         |  8 +-------
 sys/netinet/cc/cc_cubic.c   |  8 +-------
 sys/netinet/cc/cc_dctcp.c   |  8 +-------
 sys/netinet/cc/cc_htcp.c    |  8 +-------
 sys/netinet/cc/cc_newreno.c |  8 +-------
 sys/netinet/tcp_input.c     | 26 +++++++++++---------------
 6 files changed, 16 insertions(+), 50 deletions(-)

diff --git a/sys/netinet/cc/cc.c b/sys/netinet/cc/cc.c
index eae5b7bca4d9..a34eefcf0066 100644
--- a/sys/netinet/cc/cc.c
+++ b/sys/netinet/cc/cc.c
@@ -500,13 +500,7 @@ newreno_cc_cong_signal(struct cc_var *ccv, ccsignal_t type)
                break;
        case CC_RTO:
                if (CCV(ccv, t_rxtshift) == 1) {
-                       if (V_tcp_do_newsack) {
-                               pipe = tcp_compute_pipe(ccv->tp);
-                       } else {
-                               pipe = CCV(ccv, snd_max) -
-                                       CCV(ccv, snd_fack) +
-                                       CCV(ccv, sackhint.sack_bytes_rexmit);
-                       }
+                       pipe = tcp_compute_pipe(ccv->tp);
                        CCV(ccv, snd_ssthresh) = max(2,
                                min(CCV(ccv, snd_wnd), pipe) / 2 / mss) * mss;
                }
diff --git a/sys/netinet/cc/cc_cubic.c b/sys/netinet/cc/cc_cubic.c
index 91d6642eb08d..82b0d9b7fa99 100644
--- a/sys/netinet/cc/cc_cubic.c
+++ b/sys/netinet/cc/cc_cubic.c
@@ -470,13 +470,7 @@ cubic_cong_signal(struct cc_var *ccv, ccsignal_t type)
                        cubic_data->undo_cwnd_epoch = cubic_data->cwnd_epoch;
                        cubic_data->undo_W_max = cubic_data->W_max;
                        cubic_data->undo_K = cubic_data->K;
-                       if (V_tcp_do_newsack) {
-                               pipe = tcp_compute_pipe(ccv->tp);
-                       } else {
-                               pipe = CCV(ccv, snd_max) -
-                                       CCV(ccv, snd_fack) +
-                                       CCV(ccv, sackhint.sack_bytes_rexmit);
-                       }
+                       pipe = tcp_compute_pipe(ccv->tp);
                        CCV(ccv, snd_ssthresh) = max(2,
                                (((uint64_t)min(CCV(ccv, snd_wnd), pipe) *
                                CUBIC_BETA) >> CUBIC_SHIFT) / mss) * mss;
diff --git a/sys/netinet/cc/cc_dctcp.c b/sys/netinet/cc/cc_dctcp.c
index f43efe0e27c7..757bc005edb4 100644
--- a/sys/netinet/cc/cc_dctcp.c
+++ b/sys/netinet/cc/cc_dctcp.c
@@ -294,13 +294,7 @@ dctcp_cong_signal(struct cc_var *ccv, ccsignal_t type)
                        break;
                case CC_RTO:
                        if (CCV(ccv, t_rxtshift) == 1) {
-                               if (V_tcp_do_newsack) {
-                                       pipe = tcp_compute_pipe(ccv->tp);
-                               } else {
-                                       pipe = CCV(ccv, snd_max) -
-                                               CCV(ccv, snd_fack) +
-                                               CCV(ccv, 
sackhint.sack_bytes_rexmit);
-                               }
+                               pipe = tcp_compute_pipe(ccv->tp);
                                CCV(ccv, snd_ssthresh) = max(2,
                                        min(CCV(ccv, snd_wnd), pipe) / 2 / mss) 
* mss;
                        }
diff --git a/sys/netinet/cc/cc_htcp.c b/sys/netinet/cc/cc_htcp.c
index 13441bb49190..ab6165f2e720 100644
--- a/sys/netinet/cc/cc_htcp.c
+++ b/sys/netinet/cc/cc_htcp.c
@@ -325,13 +325,7 @@ htcp_cong_signal(struct cc_var *ccv, ccsignal_t type)
 
        case CC_RTO:
                if (CCV(ccv, t_rxtshift) == 1) {
-                       if (V_tcp_do_newsack) {
-                               pipe = tcp_compute_pipe(ccv->tp);
-                       } else {
-                               pipe = CCV(ccv, snd_max) -
-                                       CCV(ccv, snd_fack) +
-                                       CCV(ccv, sackhint.sack_bytes_rexmit);
-                       }
+                       pipe = tcp_compute_pipe(ccv->tp);
                        CCV(ccv, snd_ssthresh) = max(2,
                                min(CCV(ccv, snd_wnd), pipe) / 2 / mss) * mss;
                }
diff --git a/sys/netinet/cc/cc_newreno.c b/sys/netinet/cc/cc_newreno.c
index d7172fa78bc4..de7b878152b0 100644
--- a/sys/netinet/cc/cc_newreno.c
+++ b/sys/netinet/cc/cc_newreno.c
@@ -428,13 +428,7 @@ newreno_cong_signal(struct cc_var *ccv, ccsignal_t type)
                break;
        case CC_RTO:
                if (CCV(ccv, t_rxtshift) == 1) {
-                       if (V_tcp_do_newsack) {
-                               pipe = tcp_compute_pipe(ccv->tp);
-                       } else {
-                               pipe = CCV(ccv, snd_max) -
-                                       CCV(ccv, snd_fack) +
-                                       CCV(ccv, sackhint.sack_bytes_rexmit);
-                       }
+                       pipe = tcp_compute_pipe(ccv->tp);
                        CCV(ccv, snd_ssthresh) = max(2,
                                ((uint64_t)min(CCV(ccv, snd_wnd), pipe) *
                                    (uint64_t)factor) /
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index e21043fac0cf..cf480ccf9772 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -2660,12 +2660,7 @@ tcp_do_segment(struct tcpcb *tp, struct mbuf *m, struct 
tcphdr *th,
                                                 * we have less than ssthresh
                                                 * worth of data in flight.
                                                 */
-                                               if (V_tcp_do_newsack) {
-                                                       awnd = 
tcp_compute_pipe(tp);
-                                               } else {
-                                                       awnd = (tp->snd_nxt - 
tp->snd_fack) +
-                                                               
tp->sackhint.sack_bytes_rexmit;
-                                               }
+                                               awnd = tcp_compute_pipe(tp);
                                                if (awnd < tp->snd_ssthresh) {
                                                        tp->snd_cwnd += 
imax(maxseg,
                                                            imin(2 * maxseg,
@@ -4098,11 +4093,7 @@ tcp_do_prr_ack(struct tcpcb *tp, struct tcphdr *th, 
struct tcpopt *to,
            (IN_CONGRECOVERY(tp->t_flags) &&
             !IN_FASTRECOVERY(tp->t_flags))) {
                del_data = tp->sackhint.delivered_data;
-               if (V_tcp_do_newsack)
-                       pipe = tcp_compute_pipe(tp);
-               else
-                       pipe = (tp->snd_nxt - tp->snd_fack) +
-                               tp->sackhint.sack_bytes_rexmit;
+               pipe = tcp_compute_pipe(tp);
        } else {
                if (tp->sackhint.prr_delivered < (tcprexmtthresh * maxseg +
                                             tp->snd_recover - tp->snd_una)) {
@@ -4206,14 +4197,19 @@ tcp_newreno_partial_ack(struct tcpcb *tp, struct tcphdr 
*th)
 int
 tcp_compute_pipe(struct tcpcb *tp)
 {
-       if (tp->t_fb->tfb_compute_pipe == NULL) {
-               return (tp->snd_max - tp->snd_una +
+       int pipe;
+
+       if (tp->t_fb->tfb_compute_pipe != NULL) {
+               pipe = (*tp->t_fb->tfb_compute_pipe)(tp);
+       } else if (V_tcp_do_newsack) {
+               pipe = tp->snd_max - tp->snd_una +
                        tp->sackhint.sack_bytes_rexmit -
                        tp->sackhint.sacked_bytes -
-                       tp->sackhint.lost_bytes);
+                       tp->sackhint.lost_bytes;
        } else {
-               return((*tp->t_fb->tfb_compute_pipe)(tp));
+               pipe = tp->snd_nxt - tp->snd_fack + 
tp->sackhint.sack_bytes_rexmit;
        }
+       return (imax(pipe, 0));
 }
 
 uint32_t

Reply via email to