summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2019-08-16 10:33:49 -0700
committerDamjan Marion <dmarion@me.com>2019-08-19 09:22:18 +0000
commitd206724e78d99aee5d91d43fb0832d51d70eb57a (patch)
treed4a61d3764f84f9e26998bb6c3869bf44875969a
parent14bea1bb6505c0134dd5d2a18bcc436ce72cd149 (diff)
tcp: allow cc algos to set pacing rate
Type: feature Change-Id: Ie7f0f5d2a476d401ede567e422abb953b2bb4a78 Signed-off-by: Florin Coras <fcoras@cisco.com>
-rw-r--r--src/vnet/tcp/tcp.c10
-rw-r--r--src/vnet/tcp/tcp.h13
2 files changed, 15 insertions, 8 deletions
diff --git a/src/vnet/tcp/tcp.c b/src/vnet/tcp/tcp.c
index 327703327aa..4628e4ba38d 100644
--- a/src/vnet/tcp/tcp.c
+++ b/src/vnet/tcp/tcp.c
@@ -1263,17 +1263,11 @@ const static transport_proto_vft_t tcp_proto = {
void
tcp_connection_tx_pacer_update (tcp_connection_t * tc)
{
- f64 srtt;
- u64 rate;
-
if (!transport_connection_is_tx_paced (&tc->connection))
return;
- srtt = clib_min ((f64) tc->srtt * TCP_TICK, tc->mrtt_us);
- /* TODO should constrain to interface's max throughput but
- * we don't have link speeds for sw ifs ..*/
- rate = tc->cwnd / srtt;
- transport_connection_tx_pacer_update (&tc->connection, rate);
+ transport_connection_tx_pacer_update (&tc->connection,
+ tcp_cc_get_pacing_rate (tc));
}
void
diff --git a/src/vnet/tcp/tcp.h b/src/vnet/tcp/tcp.h
index 753a1ca6996..81ce1d52bde 100644
--- a/src/vnet/tcp/tcp.h
+++ b/src/vnet/tcp/tcp.h
@@ -417,6 +417,7 @@ struct _tcp_cc_algorithm
void (*recovered) (tcp_connection_t * tc);
void (*undo_recovery) (tcp_connection_t * tc);
void (*event) (tcp_connection_t *tc, tcp_cc_event_t evt);
+ u64 (*get_pacing_rate) (tcp_connection_t *tc);
};
/* *INDENT-ON* */
@@ -1053,6 +1054,18 @@ tcp_cc_event (tcp_connection_t * tc, tcp_cc_event_t evt)
tc->cc_algo->event (tc, evt);
}
+static inline u64
+tcp_cc_get_pacing_rate (tcp_connection_t * tc)
+{
+ if (tc->cc_algo->get_pacing_rate)
+ return tc->cc_algo->get_pacing_rate (tc);
+
+ f64 srtt = clib_min ((f64) tc->srtt * TCP_TICK, tc->mrtt_us);
+ /* TODO should constrain to interface's max throughput but
+ * we don't have link speeds for sw ifs ..*/
+ return (tc->cwnd / srtt);
+}
+
always_inline void
tcp_timer_set (tcp_connection_t * tc, u8 timer_id, u32 interval)
{