From f50168dfeddc5bb4133e1a416ee9548986ec8b4c Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> Date: Fri, 22 May 2020 20:35:05 +0900 Subject: [PATCH] Don't increase cwnd if it exceeds target cwnd --- lib/ngtcp2_cc.c | 19 +++++++++++++++++-- lib/ngtcp2_cc.h | 5 +++++ lib/ngtcp2_conn.c | 10 +++------- lib/ngtcp2_rtb.c | 11 ++++++----- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/lib/ngtcp2_cc.c b/lib/ngtcp2_cc.c index 072cbed0..82fcf70c 100644 --- a/lib/ngtcp2_cc.c +++ b/lib/ngtcp2_cc.c @@ -31,6 +31,12 @@ #include "ngtcp2_mem.h" #include "ngtcp2_rcvry.h" +uint64_t ngtcp2_cc_compute_initcwnd(size_t max_packet_size) { + uint64_t n = 2 * max_packet_size; + n = ngtcp2_max(n, 14720); + return ngtcp2_min(10 * max_packet_size, n); +} + ngtcp2_cc_pkt *ngtcp2_cc_pkt_init(ngtcp2_cc_pkt *pkt, int64_t pkt_num, size_t pktlen, ngtcp2_tstamp ts_sent) { pkt->pkt_num = pkt_num; @@ -95,6 +101,10 @@ void ngtcp2_cc_reno_cc_on_pkt_acked(ngtcp2_cc *ccx, ngtcp2_conn_stat *cstat, return; } + if (cc->target_cwnd && cc->target_cwnd < cstat->cwnd) { + return; + } + if (cstat->cwnd < cstat->ssthresh) { cstat->cwnd += pkt->pktlen; ngtcp2_log_info(cc->ccb.log, NGTCP2_LOG_EVENT_RCV, @@ -150,7 +160,8 @@ void ngtcp2_cc_reno_cc_on_ack_recv(ngtcp2_cc *ccx, ngtcp2_conn_stat *cstat, if (cstat->min_rtt != UINT64_MAX && cc->max_delivery_rate_sec) { target_cwnd = cc->max_delivery_rate_sec * cstat->min_rtt * 289 / NGTCP2_SECONDS / 100; - min_cwnd = 2 * cstat->max_packet_size; + + min_cwnd = ngtcp2_cc_compute_initcwnd(cstat->max_packet_size) * 289 / 100; cc->target_cwnd = ngtcp2_max(min_cwnd, target_cwnd); ngtcp2_log_info(cc->ccb.log, NGTCP2_LOG_EVENT_RCV, @@ -233,6 +244,10 @@ void ngtcp2_cc_cubic_cc_on_pkt_acked(ngtcp2_cc *ccx, ngtcp2_conn_stat *cstat, return; } + if (cc->target_cwnd && cc->target_cwnd < cstat->cwnd) { + return; + } + if (cstat->cwnd < cstat->ssthresh) { /* slow-start */ cstat->cwnd += pkt->pktlen; @@ -362,7 +377,7 @@ void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *ccx, ngtcp2_conn_stat *cstat, target_cwnd = cc->max_delivery_rate_sec * cstat->min_rtt * 289 / NGTCP2_SECONDS / 100; - min_cwnd = 2 * cstat->max_packet_size; + min_cwnd = ngtcp2_cc_compute_initcwnd(cstat->max_packet_size) * 289 / 100; cc->target_cwnd = ngtcp2_max(min_cwnd, target_cwnd); ngtcp2_log_info(cc->ccb.log, NGTCP2_LOG_EVENT_RCV, diff --git a/lib/ngtcp2_cc.h b/lib/ngtcp2_cc.h index c606d854..9fbeaac3 100644 --- a/lib/ngtcp2_cc.h +++ b/lib/ngtcp2_cc.h @@ -37,6 +37,11 @@ struct ngtcp2_log; typedef struct ngtcp2_log ngtcp2_log; +/* + * ngtcp2_cc_compute_initcwnd computes initial cwnd. + */ +uint64_t ngtcp2_cc_compute_initcwnd(size_t max_packet_size); + ngtcp2_cc_pkt *ngtcp2_cc_pkt_init(ngtcp2_cc_pkt *pkt, int64_t pkt_num, size_t pktlen, ngtcp2_tstamp ts_sent); diff --git a/lib/ngtcp2_conn.c b/lib/ngtcp2_conn.c index 32deb41c..4c51c7af 100644 --- a/lib/ngtcp2_conn.c +++ b/lib/ngtcp2_conn.c @@ -514,8 +514,6 @@ static int ts_retired_less(const ngtcp2_pq_entry *lhs, } static void conn_reset_conn_stat(ngtcp2_conn *conn, ngtcp2_conn_stat *cstat) { - uint64_t cwnd, min_cwnd; - memset(cstat, 0, sizeof(*cstat)); cstat->smoothed_rtt = NGTCP2_DEFAULT_INITIAL_RTT; cstat->rttvar = NGTCP2_DEFAULT_INITIAL_RTT / 2; @@ -524,9 +522,7 @@ static void conn_reset_conn_stat(ngtcp2_conn *conn, ngtcp2_conn_stat *cstat) { memset(cstat->last_tx_pkt_ts, 0xff, sizeof(cstat->last_tx_pkt_ts)); memset(cstat->loss_time, 0xff, sizeof(cstat->loss_time)); cstat->max_packet_size = conn->local.settings.max_packet_size; - min_cwnd = 2 * cstat->max_packet_size; - cwnd = ngtcp2_max(min_cwnd, 14720); - cstat->cwnd = ngtcp2_min(10 * cstat->max_packet_size, cwnd); + cstat->cwnd = ngtcp2_cc_compute_initcwnd(cstat->max_packet_size); cstat->ssthresh = UINT64_MAX; } @@ -1228,7 +1224,7 @@ static uint64_t conn_cwnd_is_zero(ngtcp2_conn *conn) { uint64_t bytes_in_flight = conn->cstat.bytes_in_flight; uint64_t cwnd = conn->pv && (conn->pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) - ? /* min_cwnd = */ 2 * conn->cstat.max_packet_size + ? ngtcp2_cc_compute_initcwnd(conn->cstat.max_packet_size) : conn->cstat.cwnd; return bytes_in_flight >= cwnd; @@ -8888,7 +8884,7 @@ void ngtcp2_conn_update_rtt(ngtcp2_conn *conn, ngtcp2_duration rtt, ngtcp2_duration ack_delay) { ngtcp2_conn_stat *cstat = &conn->cstat; - rtt = ngtcp2_max(rtt, NGTCP2_NANOSECONDS); + rtt = ngtcp2_max(rtt, NGTCP2_GRANULARITY); cstat->latest_rtt = rtt; diff --git a/lib/ngtcp2_rtb.c b/lib/ngtcp2_rtb.c index b2ce59a9..e1c08d60 100644 --- a/lib/ngtcp2_rtb.c +++ b/lib/ngtcp2_rtb.c @@ -446,6 +446,9 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, ngtcp2_conn_update_rtt(conn, pkt_ts - largest_pkt_sent_ts, fr->ack_delay_unscaled); } + + ngtcp2_rst_on_ack_recv(rtb->rst, cstat); + cc->on_ack_recv(cc, cstat, ts); rtb_on_pkt_acked(rtb, ent, cstat, ts); /* At this point, it is invalided because rtb->ents might be modified. */ @@ -483,6 +486,9 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, ngtcp2_conn_update_rtt(conn, pkt_ts - largest_pkt_sent_ts, fr->ack_delay_unscaled); } + + ngtcp2_rst_on_ack_recv(rtb->rst, cstat); + cc->on_ack_recv(cc, cstat, ts); rtb_on_pkt_acked(rtb, ent, cstat, ts); } rtb_remove(rtb, &it, ent, cstat); @@ -492,11 +498,6 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, ++i; } - if (conn) { - ngtcp2_rst_on_ack_recv(rtb->rst, cstat); - cc->on_ack_recv(cc, cstat, ts); - } - return num_acked; } -- GitLab