svn commit: r367007 - in head/sys/netinet: . cc
Richard Scheffenegger
rscheff at FreeBSD.org
Sat Oct 24 16:09:20 UTC 2020
Author: rscheff
Date: Sat Oct 24 16:09:18 2020
New Revision: 367007
URL: https://svnweb.freebsd.org/changeset/base/367007
Log:
tcp: move cwnd and ssthresh updates into cc modules
This will pave the way of setting ssthresh differently in TCP CUBIC, according
to RFC8312 section 4.7.
No functional change, only code movement.
Submitted by: chengc_netapp.com
Reviewed by: rrs, tuexen, rscheff
MFC after: 2 weeks
Sponsored by: NetApp, Inc.
Differential Revision: https://reviews.freebsd.org/D26807
Modified:
head/sys/netinet/cc/cc_cubic.c
head/sys/netinet/cc/cc_dctcp.c
head/sys/netinet/cc/cc_htcp.c
head/sys/netinet/cc/cc_newreno.c
head/sys/netinet/tcp_input.c
Modified: head/sys/netinet/cc/cc_cubic.c
==============================================================================
--- head/sys/netinet/cc/cc_cubic.c Sat Oct 24 16:05:37 2020 (r367006)
+++ head/sys/netinet/cc/cc_cubic.c Sat Oct 24 16:09:18 2020 (r367007)
@@ -264,8 +264,10 @@ static void
cubic_cong_signal(struct cc_var *ccv, uint32_t type)
{
struct cubic *cubic_data;
+ u_int mss;
cubic_data = ccv->cc_data;
+ mss = tcp_maxseg(ccv->ccvc.tcp);
switch (type) {
case CC_NDUPACK:
@@ -292,6 +294,10 @@ cubic_cong_signal(struct cc_var *ccv, uint32_t type)
break;
case CC_RTO:
+ CCV(ccv, snd_ssthresh) = max(min(CCV(ccv, snd_wnd),
+ CCV(ccv, snd_cwnd)) / 2 / mss,
+ 2) * mss;
+ CCV(ccv, snd_cwnd) = mss;
/*
* Grab the current time and record it so we know when the
* most recent congestion event was. Only record it when the
Modified: head/sys/netinet/cc/cc_dctcp.c
==============================================================================
--- head/sys/netinet/cc/cc_dctcp.c Sat Oct 24 16:05:37 2020 (r367006)
+++ head/sys/netinet/cc/cc_dctcp.c Sat Oct 24 16:09:18 2020 (r367007)
@@ -235,7 +235,7 @@ dctcp_cong_signal(struct cc_var *ccv, uint32_t type)
if (CCV(ccv, t_flags2) & TF2_ECN_PERMIT) {
dctcp_data = ccv->cc_data;
cwin = CCV(ccv, snd_cwnd);
- mss = CCV(ccv, t_maxseg);
+ mss = tcp_maxseg(ccv->ccvc.tcp);
switch (type) {
case CC_NDUPACK:
@@ -282,6 +282,10 @@ dctcp_cong_signal(struct cc_var *ccv, uint32_t type)
dctcp_data->ece_curr = 1;
break;
case CC_RTO:
+ CCV(ccv, snd_ssthresh) = max(min(CCV(ccv, snd_wnd),
+ CCV(ccv, snd_cwnd)) / 2 / mss,
+ 2) * mss;
+ CCV(ccv, snd_cwnd) = mss;
dctcp_update_alpha(ccv);
dctcp_data->save_sndnxt += CCV(ccv, t_maxseg);
dctcp_data->num_cong_events++;
Modified: head/sys/netinet/cc/cc_htcp.c
==============================================================================
--- head/sys/netinet/cc/cc_htcp.c Sat Oct 24 16:05:37 2020 (r367006)
+++ head/sys/netinet/cc/cc_htcp.c Sat Oct 24 16:09:18 2020 (r367007)
@@ -271,8 +271,10 @@ static void
htcp_cong_signal(struct cc_var *ccv, uint32_t type)
{
struct htcp *htcp_data;
+ u_int mss;
htcp_data = ccv->cc_data;
+ mss = tcp_maxseg(ccv->ccvc.tcp);
switch (type) {
case CC_NDUPACK:
@@ -311,6 +313,10 @@ htcp_cong_signal(struct cc_var *ccv, uint32_t type)
break;
case CC_RTO:
+ CCV(ccv, snd_ssthresh) = max(min(CCV(ccv, snd_wnd),
+ CCV(ccv, snd_cwnd)) / 2 / mss,
+ 2) * mss;
+ CCV(ccv, snd_cwnd) = mss;
/*
* Grab the current time and record it so we know when the
* most recent congestion event was. Only record it when the
Modified: head/sys/netinet/cc/cc_newreno.c
==============================================================================
--- head/sys/netinet/cc/cc_newreno.c Sat Oct 24 16:05:37 2020 (r367006)
+++ head/sys/netinet/cc/cc_newreno.c Sat Oct 24 16:09:18 2020 (r367007)
@@ -237,7 +237,7 @@ newreno_cong_signal(struct cc_var *ccv, uint32_t type)
u_int mss;
cwin = CCV(ccv, snd_cwnd);
- mss = CCV(ccv, t_maxseg);
+ mss = tcp_maxseg(ccv->ccvc.tcp);
nreno = ccv->cc_data;
beta = (nreno == NULL) ? V_newreno_beta : nreno->beta;
beta_ecn = (nreno == NULL) ? V_newreno_beta_ecn : nreno->beta_ecn;
@@ -274,6 +274,12 @@ newreno_cong_signal(struct cc_var *ccv, uint32_t type)
CCV(ccv, snd_cwnd) = cwin;
ENTER_CONGRECOVERY(CCV(ccv, t_flags));
}
+ break;
+ case CC_RTO:
+ CCV(ccv, snd_ssthresh) = max(min(CCV(ccv, snd_wnd),
+ CCV(ccv, snd_cwnd)) / 2 / mss,
+ 2) * mss;
+ CCV(ccv, snd_cwnd) = mss;
break;
}
}
Modified: head/sys/netinet/tcp_input.c
==============================================================================
--- head/sys/netinet/tcp_input.c Sat Oct 24 16:05:37 2020 (r367006)
+++ head/sys/netinet/tcp_input.c Sat Oct 24 16:09:18 2020 (r367007)
@@ -429,8 +429,6 @@ cc_conn_init(struct tcpcb *tp)
void inline
cc_cong_signal(struct tcpcb *tp, struct tcphdr *th, uint32_t type)
{
- u_int maxseg;
-
INP_WLOCK_ASSERT(tp->t_inpcb);
#ifdef STATS
@@ -460,13 +458,9 @@ cc_cong_signal(struct tcpcb *tp, struct tcphdr *th, ui
}
break;
case CC_RTO:
- maxseg = tcp_maxseg(tp);
tp->t_dupacks = 0;
tp->t_bytes_acked = 0;
EXIT_RECOVERY(tp->t_flags);
- tp->snd_ssthresh = max(2, min(tp->snd_wnd, tp->snd_cwnd) / 2 /
- maxseg) * maxseg;
- tp->snd_cwnd = maxseg;
if (tp->t_flags2 & TF2_ECN_PERMIT)
tp->t_flags2 |= TF2_ECN_SND_CWR;
break;
More information about the svn-src-head
mailing list