tcp: allow cc algos to set pacing rate 63/21363/2
authorFlorin Coras <fcoras@cisco.com>
Fri, 16 Aug 2019 17:33:49 +0000 (10:33 -0700)
committerDamjan Marion <dmarion@me.com>
Mon, 19 Aug 2019 09:22:18 +0000 (09:22 +0000)
Type: feature

Change-Id: Ie7f0f5d2a476d401ede567e422abb953b2bb4a78
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/vnet/tcp/tcp.c
src/vnet/tcp/tcp.h

index 3277033..4628e4b 100644 (file)
@@ -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
index 753a1ca..81ce1d5 100644 (file)
@@ -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)
 {