tcp: allow registration of new cc algo types

Type: feature

Change-Id: I83e21b508a19df1beb207d961c8f2b52347deca0
Signed-off-by: Florin Coras <fcoras@cisco.com>
diff --git a/src/vnet/tcp/tcp.h b/src/vnet/tcp/tcp.h
index 98808c1..aeae57c 100644
--- a/src/vnet/tcp/tcp.h
+++ b/src/vnet/tcp/tcp.h
@@ -235,6 +235,7 @@
 {
   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 @@
   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 @@
 
   /** 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 @@
 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 *