diff options
author | Florin Coras <fcoras@cisco.com> | 2018-05-21 17:47:40 -0700 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2018-10-25 10:13:18 +0000 |
commit | d67f112063e6c57160a3d0260537b9dcfe23d217 (patch) | |
tree | c2d5251e7896290cc0a968fb2b4d6d9ba87aef17 /src/vnet/tcp/tcp_input.c | |
parent | 2fab01ee0f9b406584272968863eee16a3bb1fb9 (diff) |
tcp/session: add tx pacer
Adds tx pacing infrastructure for transport protocols that want to use
it. Particularly useful for connections with non-negligible rtt and
constrained network throughput as it avoids large tx bursts that lead to
local interface tx or network drops.
By default the pacer is disabled. To enabled it for tcp, add tx-pacing
to tcp's startup conf. We are still slightly inefficient in the handling
of incoming packets in established state so the pacer slightly affect
maximum throughput in low lacency scenarios.
Change-Id: Id445b2ffcd64cce015f75b773f7d722faa0f7ca9
Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vnet/tcp/tcp_input.c')
-rw-r--r-- | src/vnet/tcp/tcp_input.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/src/vnet/tcp/tcp_input.c b/src/vnet/tcp/tcp_input.c index 39a538ba681..ac0e996567e 100644 --- a/src/vnet/tcp/tcp_input.c +++ b/src/vnet/tcp/tcp_input.c @@ -462,14 +462,15 @@ tcp_update_rtt (tcp_connection_t * tc, u32 ack) if (tc->rtt_ts && seq_geq (ack, tc->rtt_seq)) { - mrtt = tcp_time_now () - tc->rtt_ts; + tc->mrtt_us = tcp_time_now_us (tc->c_thread_index) - tc->rtt_ts; + mrtt = clib_max ((u32) (tc->mrtt_us * THZ), 1); } /* As per RFC7323 TSecr can be used for RTTM only if the segment advances * snd_una, i.e., the left side of the send window: * seq_lt (tc->snd_una, ack). This is a condition for calling update_rtt */ else if (tcp_opts_tstamp (&tc->rcv_opts) && tc->rcv_opts.tsecr) { - mrtt = tcp_time_now () - tc->rcv_opts.tsecr; + mrtt = clib_max (tcp_time_now () - tc->rcv_opts.tsecr, 1); } /* Ignore dubious measurements */ @@ -1079,12 +1080,14 @@ tcp_cc_fastrecovery_exit (tcp_connection_t * tc) tc->snd_nxt = tc->snd_una_max; tc->snd_rxt_bytes = 0; - /* HACK: since we don't have an output pacer, force slow start */ - tc->cwnd = 20 * tc->snd_mss; - tcp_fastrecovery_off (tc); tcp_fastrecovery_1_smss_off (tc); tcp_fastrecovery_first_off (tc); + + /* Update pacer because our cwnd changed. Also makes sure + * that we recompute the max burst size */ + tcp_update_pacer (tc); + TCP_EVT_DBG (TCP_EVT_CC_EVT, tc, 3); } @@ -1153,8 +1156,7 @@ tcp_cc_update (tcp_connection_t * tc, vlib_buffer_t * b) ASSERT (!tcp_in_cong_recovery (tc) || tcp_is_lost_fin (tc)); /* Congestion avoidance */ - tc->cc_algo->rcv_ack (tc); - tc->tsecr_last_ack = tc->rcv_opts.tsecr; + tcp_cc_rcv_ack (tc); /* If a cumulative ack, make sure dupacks is 0 */ tc->rcv_dupacks = 0; @@ -1372,8 +1374,7 @@ partial_ack: tc->snd_nxt = tc->snd_una_max; /* Treat as congestion avoidance ack */ - tc->cc_algo->rcv_ack (tc); - tc->tsecr_last_ack = tc->rcv_opts.tsecr; + tcp_cc_rcv_ack (tc); return; } @@ -1391,8 +1392,7 @@ partial_ack: /* Post RTO timeout don't try anything fancy */ if (tcp_in_recovery (tc)) { - tc->cc_algo->rcv_ack (tc); - tc->tsecr_last_ack = tc->rcv_opts.tsecr; + tcp_cc_rcv_ack (tc); transport_add_tx_event (&tc->connection); return; } |