The branch main has been updated by rscheff:

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

commit c358f1857f0c749ad166fb9e9bef04f4033f3a72
Author:     Richard Scheffenegger <rsch...@freebsd.org>
AuthorDate: 2021-05-26 17:45:06 +0000
Commit:     Richard Scheffenegger <rsch...@freebsd.org>
CommitDate: 2021-05-26 18:15:53 +0000

    tcp: Use local CC data only in the correct context
    
    Most CC algos do use local data, and when calling
    newreno_cong_signal from there, the latter misinterprets
    the data as its own struct, leading to incorrect behavior.
    
    Reported by:  chengc_netapp.com
    Reviewed By:  chengc_netapp.com, tuexen, #transport
    MFC after:    3 days
    Sponsored By: NetApp, Inc.
    Differential Revision: https://reviews.freebsd.org/D30470
---
 sys/netinet/cc/cc_newreno.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/sys/netinet/cc/cc_newreno.c b/sys/netinet/cc/cc_newreno.c
index 5f91ad8d1e7b..8f8ca953169e 100644
--- a/sys/netinet/cc/cc_newreno.c
+++ b/sys/netinet/cc/cc_newreno.c
@@ -239,7 +239,12 @@ newreno_cong_signal(struct cc_var *ccv, uint32_t type)
 
        cwin = CCV(ccv, snd_cwnd);
        mss = tcp_fixed_maxseg(ccv->ccvc.tcp);
-       nreno = ccv->cc_data;
+       /*
+        * Other TCP congestion controls use newreno_cong_signal(), but
+        * with their own private cc_data. Make sure the cc_data is used
+        * correctly.
+        */
+       nreno = (CC_ALGO(ccv->ccvc.tcp) == &newreno_cc_algo) ? ccv->cc_data : 
NULL;
        beta = (nreno == NULL) ? V_newreno_beta : nreno->beta;
        beta_ecn = (nreno == NULL) ? V_newreno_beta_ecn : nreno->beta_ecn;
 
@@ -336,6 +341,9 @@ newreno_ctl_output(struct cc_var *ccv, struct sockopt 
*sopt, void *buf)
        if (sopt->sopt_valsize != sizeof(struct cc_newreno_opts))
                return (EMSGSIZE);
 
+       if (CC_ALGO(ccv->ccvc.tcp) != &newreno_cc_algo)
+               return (ENOPROTOOPT);
+
        nreno = ccv->cc_data;
        opt = buf;
 
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to