summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vnet/tcp/tcp.c10
-rw-r--r--src/vnet/tcp/tcp.h18
2 files changed, 23 insertions, 5 deletions
diff --git a/src/vnet/tcp/tcp.c b/src/vnet/tcp/tcp.c
index 835bd4877c3..f72b9577eba 100644
--- a/src/vnet/tcp/tcp.c
+++ b/src/vnet/tcp/tcp.c
@@ -102,6 +102,14 @@ tcp_cc_algo_get (tcp_cc_algorithm_type_e type)
return &tm->cc_algos[type];
}
+tcp_cc_algorithm_type_e
+tcp_cc_algo_new_type (const tcp_cc_algorithm_t * vft)
+{
+ tcp_main_t *tm = vnet_get_tcp_main ();
+ tcp_cc_algo_register (++tm->cc_last_type, vft);
+ return tm->cc_last_type;
+}
+
static u32
tcp_connection_bind (u32 session_index, transport_endpoint_t * lcl)
{
@@ -1499,7 +1507,7 @@ tcp_main_enable (vlib_main_t * vm)
tcp_initialize_iss_seed (tm);
tm->bytes_per_buffer = vlib_buffer_get_default_data_size (vm);
-
+ tm->cc_last_type = TCP_CC_LAST;
return error;
}
diff --git a/src/vnet/tcp/tcp.h b/src/vnet/tcp/tcp.h
index 98808c1368b..aeae57c6c6d 100644
--- a/src/vnet/tcp/tcp.h
+++ b/src/vnet/tcp/tcp.h
@@ -235,6 +235,7 @@ typedef enum _tcp_cc_algorithm_type
{
TCP_CC_NEWRENO,
TCP_CC_CUBIC,
+ TCP_CC_LAST = TCP_CC_CUBIC
} tcp_cc_algorithm_type_e;
typedef struct _tcp_cc_algorithm tcp_cc_algorithm_t;
@@ -448,18 +449,21 @@ typedef struct _tcp_main
tcp_connection_t *half_open_connections;
clib_spinlock_t half_open_lock;
- /* Congestion control algorithms registered */
- tcp_cc_algorithm_t *cc_algos;
-
/** vlib buffer size */
u32 bytes_per_buffer;
/* Seed used to generate random iss */
tcp_iss_seed_t iss_seed;
+ /* Congestion control algorithms registered */
+ tcp_cc_algorithm_t *cc_algos;
+
/** Hash table of cc algorithms by name */
uword *cc_algo_by_name;
+ /** Last cc algo registered */
+ tcp_cc_algorithm_type_e cc_last_type;
+
/*
* Configuration
*/
@@ -495,7 +499,6 @@ typedef struct _tcp_main
/** Default congestion control algorithm type */
tcp_cc_algorithm_type_e cc_algo;
-
} tcp_main_t;
extern tcp_main_t tcp_main;
@@ -936,9 +939,16 @@ tcp_timer_is_active (tcp_connection_t * tc, tcp_timers_e timer)
void tcp_rcv_sacks (tcp_connection_t * tc, u32 ack);
u8 *tcp_scoreboard_replay (u8 * s, tcp_connection_t * tc, u8 verbose);
+/**
+ * Register exiting cc algo type
+ */
void tcp_cc_algo_register (tcp_cc_algorithm_type_e type,
const tcp_cc_algorithm_t * vft);
+/**
+ * Register new cc algo type
+ */
+tcp_cc_algorithm_type_e tcp_cc_algo_new_type (const tcp_cc_algorithm_t * vft);
tcp_cc_algorithm_t *tcp_cc_algo_get (tcp_cc_algorithm_type_e type);
static inline void *