Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F142171441
D8225.id21290.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
D8225.id21290.diff
View Options
Index: sys/netinet/cc/cc_cdg.c
===================================================================
--- sys/netinet/cc/cc_cdg.c
+++ sys/netinet/cc/cc_cdg.c
@@ -431,6 +431,11 @@
cdg_cong_signal(struct cc_var *ccv, uint32_t signal_type)
{
struct cdg *cdg_data = ccv->cc_data;
+ u_long win;
+ int mss;
+
+ win = CCV(ccv, snd_cwnd);
+ mss = CCV(ccv, t_maxseg);
switch(signal_type) {
case CC_CDG_DELAY:
@@ -448,7 +453,7 @@
*/
if (IN_CONGRECOVERY(CCV(ccv, t_flags)) ||
cdg_data->queue_state < CDG_Q_FULL) {
- CCV(ccv, snd_ssthresh) = CCV(ccv, snd_cwnd);
+ CCV(ccv, snd_ssthresh) = win;
CCV(ccv, snd_recover) = CCV(ccv, snd_max);
} else {
/*
@@ -461,13 +466,17 @@
cdg_data->shadow_w, RENO_BETA);
CCV(ccv, snd_ssthresh) = ulmax(cdg_data->shadow_w,
- cdg_window_decrease(ccv, CCV(ccv, snd_cwnd),
- V_cdg_beta_loss));
+ cdg_window_decrease(ccv, win, V_cdg_beta_loss));
+ CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
cdg_data->window_incr = cdg_data->rtt_count = 0;
}
ENTER_RECOVERY(CCV(ccv, t_flags));
break;
+ case CC_RTO:
+ CCV(ccv, snd_ssthresh) = max(2*mss, win/2);
+ CCV(ccv, snd_cwnd) = mss;
+ break;
default:
newreno_cc_algo.cong_signal(ccv, signal_type);
break;
Index: sys/netinet/cc/cc_chd.c
===================================================================
--- sys/netinet/cc/cc_chd.c
+++ sys/netinet/cc/cc_chd.c
@@ -329,11 +329,14 @@
{
struct ertt *e_t;
struct chd *chd_data;
- int qdly;
+ int qdly, mss;
+ u_long win;
e_t = khelp_get_osd(CCV(ccv, osd), ertt_id);
chd_data = ccv->cc_data;
qdly = imax(e_t->rtt, chd_data->maxrtt_in_rtt) - e_t->minrtt;
+ win = CCV(ccv, snd_cwnd);
+ mss = CCV(ccv, t_maxseg);
switch(signal_type) {
case CC_CHD_DELAY:
@@ -373,6 +376,10 @@
}
ENTER_FASTRECOVERY(CCV(ccv, t_flags));
break;
+ case CC_RTO:
+ CCV(ccv, snd_ssthresh) = max(2*mss, win/2);
+ CCV(ccv, snd_cwnd) = mss;
+ break;
default:
newreno_cc_algo.cong_signal(ccv, signal_type);
Index: sys/netinet/cc/cc_cubic.c
===================================================================
--- sys/netinet/cc/cc_cubic.c
+++ sys/netinet/cc/cc_cubic.c
@@ -225,8 +225,12 @@
cubic_cong_signal(struct cc_var *ccv, uint32_t type)
{
struct cubic *cubic_data;
+ u_long win;
+ int mss;
cubic_data = ccv->cc_data;
+ win = CCV(ccv, snd_cwnd);
+ mss = CCV(ccv, t_maxseg);
switch (type) {
case CC_NDUPACK:
@@ -235,7 +239,8 @@
cubic_ssthresh_update(ccv);
cubic_data->num_cong_events++;
cubic_data->prev_max_cwnd = cubic_data->max_cwnd;
- cubic_data->max_cwnd = CCV(ccv, snd_cwnd);
+ cubic_data->max_cwnd = win;
+ CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
}
ENTER_RECOVERY(CCV(ccv, t_flags));
}
@@ -246,7 +251,7 @@
cubic_ssthresh_update(ccv);
cubic_data->num_cong_events++;
cubic_data->prev_max_cwnd = cubic_data->max_cwnd;
- cubic_data->max_cwnd = CCV(ccv, snd_cwnd);
+ cubic_data->max_cwnd = win;
cubic_data->t_last_cong = ticks;
CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
ENTER_CONGRECOVERY(CCV(ccv, t_flags));
@@ -261,9 +266,13 @@
* chance the first one is a false alarm and may not indicate
* congestion.
*/
- if (CCV(ccv, t_rxtshift) >= 2)
+ if (CCV(ccv, t_rxtshift) >= 2) {
cubic_data->num_cong_events++;
cubic_data->t_last_cong = ticks;
+ cubic_ssthresh_update(ccv);
+ cubic_data->max_cwnd = win;
+ CCV(ccv, snd_cwnd) = mss;
+ }
break;
}
}
Index: sys/netinet/cc/cc_dctcp.c
===================================================================
--- sys/netinet/cc/cc_dctcp.c
+++ sys/netinet/cc/cc_dctcp.c
@@ -230,7 +230,8 @@
dctcp_cong_signal(struct cc_var *ccv, uint32_t type)
{
struct dctcp *dctcp_data;
- u_int win, mss;
+ u_long win;
+ int mss;
dctcp_data = ccv->cc_data;
win = CCV(ccv, snd_cwnd);
@@ -284,6 +285,8 @@
dctcp_update_alpha(ccv);
dctcp_data->save_sndnxt += CCV(ccv, t_maxseg);
dctcp_data->num_cong_events++;
+ CCV(ccv, snd_ssthresh) = max(2 * mss, win / 2);
+ CCV(ccv, snd_cwnd) = mss;
}
break;
}
Index: sys/netinet/cc/cc_htcp.c
===================================================================
--- sys/netinet/cc/cc_htcp.c
+++ sys/netinet/cc/cc_htcp.c
@@ -271,8 +271,12 @@
htcp_cong_signal(struct cc_var *ccv, uint32_t type)
{
struct htcp *htcp_data;
+ u_long win;
+ int mss;
htcp_data = ccv->cc_data;
+ win = CCV(ccv, snd_cwnd);
+ mss = CCV(ccv, t_maxseg);
switch (type) {
case CC_NDUPACK:
@@ -287,8 +291,9 @@
(htcp_data->maxrtt - htcp_data->minrtt) *
95) / 100;
htcp_ssthresh_update(ccv);
+ CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
htcp_data->t_last_cong = ticks;
- htcp_data->prev_cwnd = CCV(ccv, snd_cwnd);
+ htcp_data->prev_cwnd = win;
}
ENTER_RECOVERY(CCV(ccv, t_flags));
}
@@ -305,7 +310,7 @@
htcp_ssthresh_update(ccv);
CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
htcp_data->t_last_cong = ticks;
- htcp_data->prev_cwnd = CCV(ccv, snd_cwnd);
+ htcp_data->prev_cwnd = win;
ENTER_CONGRECOVERY(CCV(ccv, t_flags));
}
break;
@@ -320,6 +325,8 @@
*/
if (CCV(ccv, t_rxtshift) >= 2)
htcp_data->t_last_cong = ticks;
+ CCV(ccv, snd_ssthresh) = max(2 * mss, win / 2);
+ CCV(ccv, snd_cwnd) = mss;
break;
}
}
Index: sys/netinet/cc/cc_newreno.c
===================================================================
--- sys/netinet/cc/cc_newreno.c
+++ sys/netinet/cc/cc_newreno.c
@@ -182,20 +182,25 @@
static void
newreno_cong_signal(struct cc_var *ccv, uint32_t type)
{
- u_int win;
+ u_long win;
+ int mss;
+
+ win = CCV(ccv, snd_cwnd);
+ mss = CCV(ccv, t_maxseg);
/* Catch algos which mistakenly leak private signal types. */
KASSERT((type & CC_SIGPRIVMASK) == 0,
("%s: congestion signal type 0x%08x is private\n", __func__, type));
- win = max(CCV(ccv, snd_cwnd) / 2 / CCV(ccv, t_maxseg), 2) *
- CCV(ccv, t_maxseg);
+ win = max(2*mss, win/2);
switch (type) {
case CC_NDUPACK:
if (!IN_FASTRECOVERY(CCV(ccv, t_flags))) {
- if (!IN_CONGRECOVERY(CCV(ccv, t_flags)))
+ if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
CCV(ccv, snd_ssthresh) = win;
+ CCV(ccv, snd_cwnd) = win;
+ }
ENTER_RECOVERY(CCV(ccv, t_flags));
}
break;
@@ -206,6 +211,10 @@
ENTER_CONGRECOVERY(CCV(ccv, t_flags));
}
break;
+ case CC_RTO:
+ CCV(ccv, snd_ssthresh) = win;
+ CCV(ccv, snd_cwnd) = mss;
+ break;
}
}
Index: sys/netinet/tcp_input.c
===================================================================
--- sys/netinet/tcp_input.c
+++ sys/netinet/tcp_input.c
@@ -434,9 +434,15 @@
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 (CC_ALGO(tp)->cong_signal == NULL) {
+ /*
+ * RFC5681 Section 3.1
+ * ssthresh = max (FlightSize / 2, 2*SMSS) eq (4)
+ */
+ tp->snd_ssthresh =
+ max((tp->snd_max - tp->snd_una) / 2, 2 * maxseg);
+ tp->snd_cwnd = maxseg;
+ }
break;
case CC_RTO_ERR:
TCPSTAT_INC(tcps_sndrexmitbad);
@@ -2587,6 +2593,15 @@
if (awnd < tp->snd_ssthresh) {
tp->snd_cwnd += maxseg;
+ /*
+ * RFC5681 Section 3.2 talks about cwnd
+ * inflation on additional dupacks and
+ * deflation on recovering from loss.
+ *
+ * We keep cwnd into check so that
+ * we don't have to 'deflate' it when we
+ * get out of recovery.
+ */
if (tp->snd_cwnd > tp->snd_ssthresh)
tp->snd_cwnd = tp->snd_ssthresh;
}
@@ -2626,19 +2641,22 @@
TCPSTAT_INC(
tcps_sack_recovery_episode);
tp->sack_newdata = tp->snd_nxt;
- tp->snd_cwnd = maxseg;
+ if (CC_ALGO(tp)->cong_signal == NULL)
+ tp->snd_cwnd = maxseg;
(void) tp->t_fb->tfb_tcp_output(tp);
goto drop;
}
tp->snd_nxt = th->th_ack;
- tp->snd_cwnd = maxseg;
+ if (CC_ALGO(tp)->cong_signal == NULL)
+ tp->snd_cwnd = maxseg;
(void) tp->t_fb->tfb_tcp_output(tp);
KASSERT(tp->snd_limited <= 2,
("%s: tp->snd_limited too big",
__func__));
- tp->snd_cwnd = tp->snd_ssthresh +
- maxseg *
- (tp->t_dupacks - tp->snd_limited);
+ if (CC_ALGO(tp)->cong_signal == NULL)
+ tp->snd_cwnd = tp->snd_ssthresh +
+ maxseg *
+ (tp->t_dupacks - tp->snd_limited);
if (SEQ_GT(onxt, tp->snd_nxt))
tp->snd_nxt = onxt;
goto drop;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Jan 17, 6:36 PM (3 h, 30 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27697687
Default Alt Text
D8225.id21290.diff (8 KB)
Attached To
Mode
D8225: Let congestion control algorithms decide congestion window.
Attached
Detach File
Event Timeline
Log In to Comment