transport: cleanup

- move transport specific types to transport_types
- add transport wrapper functions for interaction with transport
protocol vfts

Change-Id: I93f70d884585fc2f41c4a605e310c80e8a8972f2
Signed-off-by: Florin Coras <fcoras@cisco.com>
diff --git a/src/vnet/session/application.h b/src/vnet/session/application.h
index f0c0a0d..e5bb00e 100644
--- a/src/vnet/session/application.h
+++ b/src/vnet/session/application.h
@@ -16,7 +16,7 @@
 #ifndef SRC_VNET_SESSION_APPLICATION_H_
 #define SRC_VNET_SESSION_APPLICATION_H_
 
-#include <vnet/session/session.h>
+#include <vnet/session/session_types.h>
 #include <vnet/session/segment_manager.h>
 #include <vnet/session/application_namespace.h>
 
diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c
index 7b1c754..6833a93 100644
--- a/src/vnet/session/session.c
+++ b/src/vnet/session/session.c
@@ -20,12 +20,10 @@
 #include <vnet/session/session.h>
 #include <vnet/session/session_debug.h>
 #include <vnet/session/application.h>
-#include <vlibmemory/api.h>
 #include <vnet/dpo/load_balance.h>
 #include <vnet/fib/ip4_fib.h>
 
 session_manager_main_t session_manager_main;
-extern transport_proto_vft_t *tp_vfts;
 
 static inline int
 session_send_evt_to_thread (void *data, void *args, u32 thread_index,
@@ -752,14 +750,13 @@
 session_switch_pool (void *cb_args)
 {
   session_switch_pool_args_t *args = (session_switch_pool_args_t *) cb_args;
-  transport_proto_t tp;
   session_t *s;
   ASSERT (args->thread_index == vlib_get_thread_index ());
   s = session_get (args->session_index, args->thread_index);
   s->tx_fifo->master_session_index = args->new_session_index;
   s->tx_fifo->master_thread_index = args->new_thread_index;
-  tp = session_get_transport_proto (s);
-  tp_vfts[tp].cleanup (s->connection_index, s->thread_index);
+  transport_cleanup (session_get_transport_proto (s), s->connection_index,
+		     s->thread_index);
   session_free (s);
   clib_mem_free (cb_args);
 }
@@ -989,14 +986,14 @@
   int rv;
 
   tep = session_endpoint_to_transport_cfg (rmt);
-  rv = tp_vfts[rmt->transport_proto].open (tep);
+  rv = transport_connect (rmt->transport_proto, tep);
   if (rv < 0)
     {
       SESSION_DBG ("Transport failed to open connection.");
       return VNET_API_ERROR_SESSION_CONNECT;
     }
 
-  tc = tp_vfts[rmt->transport_proto].get_half_open ((u32) rv);
+  tc = transport_get_half_open (rmt->transport_proto, (u32) rv);
 
   /* For dgram type of service, allocate session and fifos now.
    */
@@ -1024,14 +1021,14 @@
   int rv;
 
   tep = session_endpoint_to_transport_cfg (rmt);
-  rv = tp_vfts[rmt->transport_proto].open (tep);
+  rv = transport_connect (rmt->transport_proto, tep);
   if (rv < 0)
     {
       SESSION_DBG ("Transport failed to open connection.");
       return VNET_API_ERROR_SESSION_CONNECT;
     }
 
-  tc = tp_vfts[rmt->transport_proto].get_half_open ((u32) rv);
+  tc = transport_get_half_open (rmt->transport_proto, (u32) rv);
 
   /* If transport offers a stream service, only allocate session once the
    * connection has been established.
@@ -1059,7 +1056,7 @@
   sep->app_wrk_index = app_wrk_index;
   sep->opaque = opaque;
 
-  return tp_vfts[rmt->transport_proto].open (tep_cfg);
+  return transport_connect (rmt->transport_proto, tep_cfg);
 }
 
 typedef int (*session_open_service_fn) (u32, session_endpoint_t *, u32);
@@ -1088,7 +1085,8 @@
 int
 session_open (u32 app_wrk_index, session_endpoint_t * rmt, u32 opaque)
 {
-  transport_service_type_t tst = tp_vfts[rmt->transport_proto].service_type;
+  transport_service_type_t tst;
+  tst = transport_protocol_service_type (rmt->transport_proto);
   return session_open_srv_fns[tst] (app_wrk_index, rmt, opaque);
 }
 
@@ -1110,7 +1108,7 @@
   /* Transport bind/listen */
   tep = session_endpoint_to_transport (sep);
   s_index = ls->session_index;
-  tc_index = tp_vfts[sep->transport_proto].bind (s_index, tep);
+  tc_index = transport_start_listen (sep->transport_proto, s_index, tep);
 
   if (tc_index == (u32) ~ 0)
     return -1;
@@ -1120,7 +1118,7 @@
   ls->connection_index = tc_index;
 
   /* Add to the main lookup table after transport was initialized */
-  tc = tp_vfts[sep->transport_proto].get_listener (tc_index);
+  tc = transport_get_listener (sep->transport_proto, tc_index);
   session_lookup_add_connection (tc, s_index);
   return 0;
 }
@@ -1135,21 +1133,16 @@
 {
   transport_proto_t tp = session_get_transport_proto (s);
   transport_connection_t *tc;
-  if (s->session_state != SESSION_STATE_LISTENING)
-    {
-      clib_warning ("not a listening session");
-      return -1;
-    }
 
-  tc = tp_vfts[tp].get_listener (s->connection_index);
+  if (s->session_state != SESSION_STATE_LISTENING)
+    return -1;
+
+  tc = transport_get_listener (tp, s->connection_index);
   if (!tc)
-    {
-      clib_warning ("no transport");
-      return VNET_API_ERROR_ADDRESS_NOT_IN_USE;
-    }
+    return VNET_API_ERROR_ADDRESS_NOT_IN_USE;
 
   session_lookup_del_connection (tc);
-  tp_vfts[tp].unbind (s->connection_index);
+  transport_stop_listen (tp, s->connection_index);
   return 0;
 }
 
@@ -1210,8 +1203,8 @@
   else
     s->session_state = SESSION_STATE_CLOSED;
 
-  tp_vfts[session_get_transport_proto (s)].close (s->connection_index,
-						  s->thread_index);
+  transport_close (session_get_transport_proto (s), s->connection_index,
+		   s->thread_index);
 }
 
 /**
@@ -1228,8 +1221,8 @@
 
   /* Delete from main lookup table before we axe the the transport */
   session_lookup_del_session (s);
-  tp_vfts[session_get_transport_proto (s)].cleanup (s->connection_index,
-						    s->thread_index);
+  transport_cleanup (session_get_transport_proto (s), s->connection_index,
+		     s->thread_index);
   /* Since we called cleanup, no delete notification will come. So, make
    * sure the session is properly freed. */
   session_free_w_fifos (s);
diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h
index 68d8276..c622e4e 100644
--- a/src/vnet/session/session.h
+++ b/src/vnet/session/session.h
@@ -17,16 +17,12 @@
 
 #include <vnet/session/session_types.h>
 #include <vnet/session/session_lookup.h>
-#include <vnet/session/transport_interface.h>
 #include <vnet/session/session_debug.h>
 #include <vnet/session/segment_manager.h>
 #include <svm/message_queue.h>
 
 #define SESSION_PROXY_LISTENER_INDEX ((u8)~0 - 1)
 
-/* TODO decide how much since we have pre-data as well */
-#define MAX_HDRS_LEN    100	/* Max number of bytes for headers */
-
 typedef enum
 {
   FIFO_EVENT_APP_RX,
@@ -298,21 +294,6 @@
 #define SESSION_Q_PROCESS_FLUSH_FRAMES	1
 #define SESSION_Q_PROCESS_STOP		2
 
-/*
- * Session manager function
- */
-always_inline session_manager_main_t *
-vnet_get_session_manager_main ()
-{
-  return &session_manager_main;
-}
-
-always_inline session_manager_worker_t *
-session_manager_get_worker (u32 thread_index)
-{
-  return &session_manager_main.wrk[thread_index];
-}
-
 always_inline u8
 stream_session_is_valid (u32 si, u8 thread_index)
 {
@@ -438,6 +419,88 @@
 }
 
 always_inline u32
+session_get_index (session_t * s)
+{
+  return (s - session_manager_main.wrk[s->thread_index].sessions);
+}
+
+always_inline session_t *
+session_clone_safe (u32 session_index, u32 thread_index)
+{
+  session_t *old_s, *new_s;
+  u32 current_thread_index = vlib_get_thread_index ();
+
+  /* If during the memcpy pool is reallocated AND the memory allocator
+   * decides to give the old chunk of memory to somebody in a hurry to
+   * scribble something on it, we have a problem. So add this thread as
+   * a session pool peeker.
+   */
+  session_pool_add_peeker (thread_index);
+  new_s = session_alloc (current_thread_index);
+  old_s = session_manager_main.wrk[thread_index].sessions + session_index;
+  clib_memcpy_fast (new_s, old_s, sizeof (*new_s));
+  session_pool_remove_peeker (thread_index);
+  new_s->thread_index = current_thread_index;
+  new_s->session_index = session_get_index (new_s);
+  return new_s;
+}
+
+int session_open (u32 app_index, session_endpoint_t * tep, u32 opaque);
+int session_listen (session_t * s, session_endpoint_cfg_t * sep);
+int session_stop_listen (session_t * s);
+void session_close (session_t * s);
+void session_transport_close (session_t * s);
+void session_transport_cleanup (session_t * s);
+int session_send_io_evt_to_thread (svm_fifo_t * f,
+				   session_evt_type_t evt_type);
+int session_dequeue_notify (session_t * s);
+int session_send_io_evt_to_thread_custom (void *data, u32 thread_index,
+					  session_evt_type_t evt_type);
+void session_send_rpc_evt_to_thread (u32 thread_index, void *fp,
+				     void *rpc_args);
+transport_connection_t *session_get_transport (session_t * s);
+
+
+u8 *format_stream_session (u8 * s, va_list * args);
+uword unformat_stream_session (unformat_input_t * input, va_list * args);
+uword unformat_transport_connection (unformat_input_t * input,
+				     va_list * args);
+
+/*
+ * Interface to transport protos
+ */
+
+int session_enqueue_stream_connection (transport_connection_t * tc,
+				       vlib_buffer_t * b, u32 offset,
+				       u8 queue_event, u8 is_in_order);
+int session_enqueue_dgram_connection (session_t * s,
+				      session_dgram_hdr_t * hdr,
+				      vlib_buffer_t * b, u8 proto,
+				      u8 queue_event);
+int stream_session_peek_bytes (transport_connection_t * tc, u8 * buffer,
+			       u32 offset, u32 max_bytes);
+u32 stream_session_dequeue_drop (transport_connection_t * tc, u32 max_bytes);
+
+int session_stream_connect_notify (transport_connection_t * tc, u8 is_fail);
+int session_dgram_connect_notify (transport_connection_t * tc,
+				  u32 old_thread_index,
+				  session_t ** new_session);
+void stream_session_init_fifos_pointers (transport_connection_t * tc,
+					 u32 rx_pointer, u32 tx_pointer);
+
+int stream_session_accept_notify (transport_connection_t * tc);
+void session_transport_closing_notify (transport_connection_t * tc);
+void session_transport_delete_notify (transport_connection_t * tc);
+void session_transport_closed_notify (transport_connection_t * tc);
+void session_transport_reset_notify (transport_connection_t * tc);
+int stream_session_accept (transport_connection_t * tc, u32 listener_index,
+			   u8 notify);
+u32 session_tx_fifo_max_dequeue (transport_connection_t * tc);
+void session_register_transport (transport_proto_t transport_proto,
+				 const transport_proto_vft_t * vft, u8 is_ip4,
+				 u32 output_node);
+
+always_inline u32
 transport_max_rx_enqueue (transport_connection_t * tc)
 {
   session_t *s = session_get (tc->s_index, tc->thread_index);
@@ -484,88 +547,6 @@
   return session_manager_main.wrk[thread_index].last_vlib_time;
 }
 
-always_inline u32
-session_get_index (session_t * s)
-{
-  return (s - session_manager_main.wrk[s->thread_index].sessions);
-}
-
-always_inline session_t *
-session_clone_safe (u32 session_index, u32 thread_index)
-{
-  session_t *old_s, *new_s;
-  u32 current_thread_index = vlib_get_thread_index ();
-
-  /* If during the memcpy pool is reallocated AND the memory allocator
-   * decides to give the old chunk of memory to somebody in a hurry to
-   * scribble something on it, we have a problem. So add this thread as
-   * a session pool peeker.
-   */
-  session_pool_add_peeker (thread_index);
-  new_s = session_alloc (current_thread_index);
-  old_s = session_manager_main.wrk[thread_index].sessions + session_index;
-  clib_memcpy_fast (new_s, old_s, sizeof (*new_s));
-  session_pool_remove_peeker (thread_index);
-  new_s->thread_index = current_thread_index;
-  new_s->session_index = session_get_index (new_s);
-  return new_s;
-}
-
-transport_connection_t *session_get_transport (session_t * s);
-
-u32 session_tx_fifo_max_dequeue (transport_connection_t * tc);
-
-int
-session_enqueue_stream_connection (transport_connection_t * tc,
-				   vlib_buffer_t * b, u32 offset,
-				   u8 queue_event, u8 is_in_order);
-int session_enqueue_dgram_connection (session_t * s,
-				      session_dgram_hdr_t * hdr,
-				      vlib_buffer_t * b, u8 proto,
-				      u8 queue_event);
-int stream_session_peek_bytes (transport_connection_t * tc, u8 * buffer,
-			       u32 offset, u32 max_bytes);
-u32 stream_session_dequeue_drop (transport_connection_t * tc, u32 max_bytes);
-
-int session_stream_connect_notify (transport_connection_t * tc, u8 is_fail);
-int session_dgram_connect_notify (transport_connection_t * tc,
-				  u32 old_thread_index,
-				  session_t ** new_session);
-int session_dequeue_notify (session_t * s);
-void stream_session_init_fifos_pointers (transport_connection_t * tc,
-					 u32 rx_pointer, u32 tx_pointer);
-
-int stream_session_accept_notify (transport_connection_t * tc);
-void session_transport_closing_notify (transport_connection_t * tc);
-void session_transport_delete_notify (transport_connection_t * tc);
-void session_transport_closed_notify (transport_connection_t * tc);
-void session_transport_reset_notify (transport_connection_t * tc);
-int stream_session_accept (transport_connection_t * tc, u32 listener_index,
-			   u8 notify);
-int session_open (u32 app_index, session_endpoint_t * tep, u32 opaque);
-int session_listen (session_t * s, session_endpoint_cfg_t * sep);
-int session_stop_listen (session_t * s);
-void session_close (session_t * s);
-void session_transport_close (session_t * s);
-void session_transport_cleanup (session_t * s);
-int session_send_io_evt_to_thread (svm_fifo_t * f,
-				   session_evt_type_t evt_type);
-int session_send_io_evt_to_thread_custom (void *data, u32 thread_index,
-					  session_evt_type_t evt_type);
-void session_send_rpc_evt_to_thread (u32 thread_index, void *fp,
-				     void *rpc_args);
-
-ssvm_private_t *session_manager_get_evt_q_segment (void);
-
-u8 *format_stream_session (u8 * s, va_list * args);
-uword unformat_stream_session (unformat_input_t * input, va_list * args);
-uword unformat_transport_connection (unformat_input_t * input,
-				     va_list * args);
-
-void session_register_transport (transport_proto_t transport_proto,
-				 const transport_proto_vft_t * vft, u8 is_ip4,
-				 u32 output_node);
-
 always_inline void
 transport_add_tx_event (transport_connection_t * tc)
 {
@@ -575,16 +556,9 @@
   session_send_io_evt_to_thread (s->tx_fifo, FIFO_EVENT_APP_TX);
 }
 
-clib_error_t *vnet_session_enable_disable (vlib_main_t * vm, u8 is_en);
-
-always_inline svm_msg_q_t *
-session_manager_get_vpp_event_queue (u32 thread_index)
-{
-  return session_manager_main.wrk[thread_index].vpp_event_queue;
-}
-
-int session_manager_flush_enqueue_events (u8 proto, u32 thread_index);
-int session_manager_flush_all_enqueue_events (u8 transport_proto);
+/*
+ * Listen sessions
+ */
 
 always_inline u64
 listen_session_get_handle (session_t * s)
@@ -634,7 +608,27 @@
 listen_session_get_local_session_endpoint (session_t * listener,
 					   session_endpoint_t * sep);
 
-void session_flush_frames_main_thread (vlib_main_t * vm);
+/*
+ * Session manager functions
+ */
+
+always_inline session_manager_main_t *
+vnet_get_session_manager_main ()
+{
+  return &session_manager_main;
+}
+
+always_inline session_manager_worker_t *
+session_manager_get_worker (u32 thread_index)
+{
+  return &session_manager_main.wrk[thread_index];
+}
+
+always_inline svm_msg_q_t *
+session_manager_get_vpp_event_queue (u32 thread_index)
+{
+  return session_manager_main.wrk[thread_index].vpp_event_queue;
+}
 
 always_inline u8
 session_manager_is_enabled ()
@@ -648,7 +642,12 @@
       return clib_error_return(0, "session layer is not enabled");	\
 } while (0)
 
+int session_manager_flush_enqueue_events (u8 proto, u32 thread_index);
+int session_manager_flush_all_enqueue_events (u8 transport_proto);
+void session_flush_frames_main_thread (vlib_main_t * vm);
+ssvm_private_t *session_manager_get_evt_q_segment (void);
 void session_node_enable_disable (u8 is_en);
+clib_error_t *vnet_session_enable_disable (vlib_main_t * vm, u8 is_en);
 
 #endif /* __included_session_h__ */
 
diff --git a/src/vnet/session/session_api.c b/src/vnet/session/session_api.c
index bd80936..8196f4c 100755
--- a/src/vnet/session/session_api.c
+++ b/src/vnet/session/session_api.c
@@ -201,7 +201,6 @@
 send_session_accept_callback (session_t * s)
 {
   app_worker_t *server_wrk = app_worker_get (s->app_wrk_index);
-  transport_proto_vft_t *tp_vft;
   vl_api_accept_session_t *mp;
   vl_api_registration_t *reg;
   transport_connection_t *tc;
@@ -241,8 +240,8 @@
       vpp_queue = session_manager_get_vpp_event_queue (s->thread_index);
       mp->vpp_event_queue_address = pointer_to_uword (vpp_queue);
       mp->handle = session_handle (s);
-      tp_vft = transport_protocol_get_vft (session_get_transport_proto (s));
-      tc = tp_vft->get_connection (s->connection_index, s->thread_index);
+      tc = transport_get_connection (session_get_transport_proto (s),
+				     s->connection_index, s->thread_index);
       mp->port = tc->rmt_port;
       mp->is_ip4 = tc->is_ip4;
       clib_memcpy_fast (&mp->ip, &tc->rmt_ip, sizeof (tc->rmt_ip));
@@ -420,7 +419,6 @@
   app_worker_t *app_wrk = app_worker_get (s->app_wrk_index);
   svm_msg_q_msg_t _msg, *msg = &_msg;
   svm_msg_q_t *vpp_queue, *app_mq;
-  transport_proto_vft_t *tp_vft;
   transport_connection_t *tc;
   session_t *listener;
   session_accepted_msg_t *mp;
@@ -457,8 +455,8 @@
       vpp_queue = session_manager_get_vpp_event_queue (s->thread_index);
       mp->vpp_event_queue_address = pointer_to_uword (vpp_queue);
       mp->handle = session_handle (s);
-      tp_vft = transport_protocol_get_vft (session_get_transport_proto (s));
-      tc = tp_vft->get_connection (s->connection_index, s->thread_index);
+      tc = transport_get_connection (session_get_transport_proto (s),
+				     s->connection_index, s->thread_index);
       mp->port = tc->rmt_port;
       mp->is_ip4 = tc->is_ip4;
       clib_memcpy_fast (&mp->ip, &tc->rmt_ip, sizeof (tc->rmt_ip));
diff --git a/src/vnet/session/session_lookup.c b/src/vnet/session/session_lookup.c
index 33fcb42..f267a4c 100644
--- a/src/vnet/session/session_lookup.c
+++ b/src/vnet/session/session_lookup.c
@@ -30,11 +30,6 @@
 #include <vnet/session/application.h>
 
 /**
- * External vector of per transport virtual functions table
- */
-extern transport_proto_vft_t *tp_vfts;
-
-/**
  * Network namespace index (i.e., fib index) to session lookup table. We
  * should have one per network protocol type but for now we only support IP4/6
  */
@@ -340,9 +335,9 @@
 int
 session_lookup_del_session (session_t * s)
 {
-  transport_proto_t tp = session_get_transport_proto (s);
   transport_connection_t *ts;
-  ts = tp_vfts[tp].get_connection (s->connection_index, s->thread_index);
+  ts = transport_get_connection (session_get_transport_proto (s),
+				 s->connection_index, s->thread_index);
   return session_lookup_del_connection (ts);
 }
 
@@ -812,12 +807,10 @@
 transport_connection_t *
 session_lookup_half_open_connection (u64 handle, u8 proto, u8 is_ip4)
 {
-  u32 sst;
-
   if (handle != HALF_OPEN_LOOKUP_INVALID_VALUE)
     {
-      sst = session_type_from_proto_and_ip (proto, is_ip4);
-      return tp_vfts[sst].get_half_open (handle & 0xFFFFFFFF);
+      u32 sst = session_type_from_proto_and_ip (proto, is_ip4);
+      return transport_get_half_open (sst, handle & 0xFFFFFFFF);
     }
   return 0;
 }
@@ -877,8 +870,8 @@
 	  return 0;
 	}
       s = session_get (kv4.value & 0xFFFFFFFFULL, thread_index);
-      return tp_vfts[proto].get_connection (s->connection_index,
-					    thread_index);
+      return transport_get_connection (proto, s->connection_index,
+				       thread_index);
     }
 
   /*
@@ -886,7 +879,7 @@
    */
   rv = clib_bihash_search_inline_16_8 (&st->v4_half_open_hash, &kv4);
   if (rv == 0)
-    return tp_vfts[proto].get_half_open (kv4.value & 0xFFFFFFFF);
+    return transport_get_half_open (proto, kv4.value & 0xFFFFFFFF);
 
   /*
    * Check the session rules table
@@ -902,7 +895,7 @@
 	}
       if ((s = session_lookup_action_to_session (action_index,
 						 FIB_PROTOCOL_IP4, proto)))
-	return tp_vfts[proto].get_listener (s->connection_index);
+	return transport_get_listener (proto, s->connection_index);
       return 0;
     }
 
@@ -911,7 +904,7 @@
    */
   s = session_lookup_listener4_i (st, lcl, lcl_port, proto, 1);
   if (s)
-    return tp_vfts[proto].get_listener (s->connection_index);
+    return transport_get_listener (proto, s->connection_index);
 
   return 0;
 }
@@ -954,8 +947,8 @@
   if (rv == 0)
     {
       s = session_get_from_handle (kv4.value);
-      return tp_vfts[proto].get_connection (s->connection_index,
-					    s->thread_index);
+      return transport_get_connection (proto, s->connection_index,
+				       s->thread_index);
     }
 
   /*
@@ -963,7 +956,7 @@
    */
   rv = clib_bihash_search_inline_16_8 (&st->v4_half_open_hash, &kv4);
   if (rv == 0)
-    return tp_vfts[proto].get_half_open (kv4.value & 0xFFFFFFFF);
+    return transport_get_half_open (proto, kv4.value & 0xFFFFFFFF);
 
   /*
    * Check the session rules table
@@ -976,7 +969,7 @@
 	return 0;
       if ((s = session_lookup_action_to_session (action_index,
 						 FIB_PROTOCOL_IP4, proto)))
-	return tp_vfts[proto].get_listener (s->connection_index);
+	return transport_get_listener (proto, s->connection_index);
       return 0;
     }
 
@@ -985,7 +978,7 @@
    */
   s = session_lookup_listener4_i (st, lcl, lcl_port, proto, 1);
   if (s)
-    return tp_vfts[proto].get_listener (s->connection_index);
+    return transport_get_listener (proto, s->connection_index);
 
   return 0;
 }
@@ -1099,14 +1092,14 @@
 	  return 0;
 	}
       s = session_get (kv6.value & 0xFFFFFFFFULL, thread_index);
-      return tp_vfts[proto].get_connection (s->connection_index,
-					    thread_index);
+      return transport_get_connection (proto, s->connection_index,
+				       thread_index);
     }
 
   /* Try half-open connections */
   rv = clib_bihash_search_inline_48_8 (&st->v6_half_open_hash, &kv6);
   if (rv == 0)
-    return tp_vfts[proto].get_half_open (kv6.value & 0xFFFFFFFF);
+    return transport_get_half_open (proto, kv6.value & 0xFFFFFFFF);
 
   /* Check the session rules table */
   action_index = session_rules_table_lookup6 (&st->session_rules[proto], lcl,
@@ -1120,14 +1113,14 @@
 	}
       if ((s = session_lookup_action_to_session (action_index,
 						 FIB_PROTOCOL_IP6, proto)))
-	return tp_vfts[proto].get_listener (s->connection_index);
+	return transport_get_listener (proto, s->connection_index);
       return 0;
     }
 
   /* If nothing is found, check if any listener is available */
   s = session_lookup_listener6_i (st, lcl, lcl_port, proto, 1);
   if (s)
-    return tp_vfts[proto].get_listener (s->connection_index);
+    return transport_get_listener (proto, s->connection_index);
 
   return 0;
 }
@@ -1168,14 +1161,14 @@
   if (rv == 0)
     {
       s = session_get_from_handle (kv6.value);
-      return tp_vfts[proto].get_connection (s->connection_index,
-					    s->thread_index);
+      return transport_get_connection (proto, s->connection_index,
+				       s->thread_index);
     }
 
   /* Try half-open connections */
   rv = clib_bihash_search_inline_48_8 (&st->v6_half_open_hash, &kv6);
   if (rv == 0)
-    return tp_vfts[proto].get_half_open (kv6.value & 0xFFFFFFFF);
+    return transport_get_half_open (proto, kv6.value & 0xFFFFFFFF);
 
   /* Check the session rules table */
   action_index = session_rules_table_lookup6 (&st->session_rules[proto], lcl,
@@ -1186,14 +1179,14 @@
 	return 0;
       if ((s = session_lookup_action_to_session (action_index,
 						 FIB_PROTOCOL_IP6, proto)))
-	return tp_vfts[proto].get_listener (s->connection_index);
+	return transport_get_listener (proto, s->connection_index);
       return 0;
     }
 
   /* If nothing is found, check if any listener is available */
   s = session_lookup_listener6_i (st, lcl, lcl_port, proto, 1);
   if (s)
-    return tp_vfts[proto].get_listener (s->connection_index);
+    return transport_get_listener (proto, s->connection_index);
 
   return 0;
 }
diff --git a/src/vnet/session/session_lookup.h b/src/vnet/session/session_lookup.h
index 5efb1f4..995d2aa 100644
--- a/src/vnet/session/session_lookup.h
+++ b/src/vnet/session/session_lookup.h
@@ -18,7 +18,6 @@
 
 #include <vnet/session/session_table.h>
 #include <vnet/session/session_types.h>
-#include <vnet/session/transport.h>
 #include <vnet/session/application_namespace.h>
 
 #define HALF_OPEN_LOOKUP_INVALID_VALUE ((u64)~0)
diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c
index fa33ad3..286bd7b 100644
--- a/src/vnet/session/session_node.c
+++ b/src/vnet/session/session_node.c
@@ -447,7 +447,7 @@
   b->flags = VNET_BUFFER_F_LOCALLY_ORIGINATED;
   b->current_data = 0;
 
-  data0 = vlib_buffer_make_headroom (b, MAX_HDRS_LEN);
+  data0 = vlib_buffer_make_headroom (b, TRANSPORT_MAX_HDRS_LEN);
   len_to_deq = clib_min (ctx->left_to_snd, ctx->deq_per_first_buf);
 
   if (peek_data)
@@ -606,12 +606,13 @@
     }
 
   n_bytes_per_buf = VLIB_BUFFER_DATA_SIZE;
-  ASSERT (n_bytes_per_buf > MAX_HDRS_LEN);
-  n_bytes_per_seg = MAX_HDRS_LEN + ctx->snd_mss;
+  ASSERT (n_bytes_per_buf > TRANSPORT_MAX_HDRS_LEN);
+  n_bytes_per_seg = TRANSPORT_MAX_HDRS_LEN + ctx->snd_mss;
   ctx->n_bufs_per_seg = ceil ((f64) n_bytes_per_seg / n_bytes_per_buf);
   ctx->deq_per_buf = clib_min (ctx->snd_mss, n_bytes_per_buf);
   ctx->deq_per_first_buf = clib_min (ctx->snd_mss,
-				     n_bytes_per_buf - MAX_HDRS_LEN);
+				     n_bytes_per_buf -
+				     TRANSPORT_MAX_HDRS_LEN);
 }
 
 always_inline int
diff --git a/src/vnet/session/session_types.h b/src/vnet/session/session_types.h
index b334c3c..286f4c4 100644
--- a/src/vnet/session/session_types.h
+++ b/src/vnet/session/session_types.h
@@ -17,7 +17,7 @@
 #define SRC_VNET_SESSION_SESSION_TYPES_H_
 
 #include <svm/svm_fifo.h>
-#include <vnet/session/transport.h>
+#include <vnet/session/transport_types.h>
 
 #define SESSION_LOCAL_HANDLE_PREFIX 0x7FFFFFFF
 
diff --git a/src/vnet/session/transport.c b/src/vnet/session/transport.c
index df5282c..2c4efe1 100644
--- a/src/vnet/session/transport.c
+++ b/src/vnet/session/transport.c
@@ -13,7 +13,7 @@
  * limitations under the License.
  */
 
-#include <vnet/session/transport_interface.h>
+#include <vnet/session/transport.h>
 #include <vnet/session/session.h>
 #include <vnet/fib/fib.h>
 
@@ -271,17 +271,35 @@
   return tp_vfts[tp].tx_type;
 }
 
-transport_connection_t *
-transport_get_connection (transport_proto_t tp, u32 conn_index,
-			  u8 thread_index)
+void
+transport_cleanup (transport_proto_t tp, u32 conn_index, u8 thread_index)
 {
-  return tp_vfts[tp].get_connection (conn_index, thread_index);
+  tp_vfts[tp].cleanup (conn_index, thread_index);
 }
 
-transport_connection_t *
-transport_get_listener (transport_proto_t tp, u32 conn_index)
+int
+transport_connect (transport_proto_t tp, transport_endpoint_cfg_t * tep)
 {
-  return tp_vfts[tp].get_listener (conn_index);
+  return tp_vfts[tp].connect (tep);
+}
+
+void
+transport_close (transport_proto_t tp, u32 conn_index, u8 thread_index)
+{
+  tp_vfts[tp].close (conn_index, thread_index);
+}
+
+u32
+transport_start_listen (transport_proto_t tp, u32 session_index,
+			transport_endpoint_t * tep)
+{
+  return tp_vfts[tp].start_listen (session_index, tep);
+}
+
+u32
+transport_stop_listen (transport_proto_t tp, u32 conn_index)
+{
+  return tp_vfts[tp].stop_listen (conn_index);
 }
 
 u8
diff --git a/src/vnet/session/transport.h b/src/vnet/session/transport.h
index a82dc3d..8500e9d 100644
--- a/src/vnet/session/transport.h
+++ b/src/vnet/session/transport.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2019 Cisco and/or its affiliates.
+ * Copyright (c) 2017-2019 Cisco and/or its affiliates.
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at:
@@ -13,184 +13,194 @@
  * limitations under the License.
  */
 
-#ifndef VNET_VNET_URI_TRANSPORT_H_
-#define VNET_VNET_URI_TRANSPORT_H_
+#ifndef SRC_VNET_SESSION_TRANSPORT_H_
+#define SRC_VNET_SESSION_TRANSPORT_H_
 
 #include <vnet/vnet.h>
-#include <vnet/ip/ip.h>
-#include <vnet/tcp/tcp_debug.h>
-
-typedef enum transport_dequeue_type_
-{
-  TRANSPORT_TX_PEEK,		/**< reliable transport protos */
-  TRANSPORT_TX_DEQUEUE,		/**< unreliable transport protos */
-  TRANSPORT_TX_INTERNAL,	/**< apps acting as transports */
-  TRANSPORT_TX_DGRAM,		/**< datagram mode */
-  TRANSPORT_TX_N_FNS
-} transport_tx_fn_type_t;
-
-typedef enum transport_service_type_
-{
-  TRANSPORT_SERVICE_VC,		/**< virtual circuit service */
-  TRANSPORT_SERVICE_CL,		/**< connectionless service */
-  TRANSPORT_SERVICE_APP,	/**< app transport service */
-  TRANSPORT_N_SERVICES
-} transport_service_type_t;
-
-typedef struct _transport_stats
-{
-  u64 tx_bytes;
-} transport_stats_t;
-
-typedef struct _spacer
-{
-  u64 bucket;
-  u32 max_burst_size;
-  f32 tokens_per_period;
-  u64 last_update;
-} spacer_t;
+#include <vnet/session/transport_types.h>
 
 /*
- * Protocol independent transport properties associated to a session
+ * Transport protocol virtual function table
  */
-typedef struct _transport_connection
+/* *INDENT-OFF* */
+typedef struct _transport_proto_vft
 {
-  /** Connection ID */
-  union
-  {
-    /*
-     * Network connection ID tuple
-     */
-    struct
-    {
-      ip46_address_t rmt_ip;	/**< Remote IP */
-      ip46_address_t lcl_ip;	/**< Local IP */
-      u16 rmt_port;		/**< Remote port */
-      u16 lcl_port;		/**< Local port */
-      u8 is_ip4;		/**< Flag if IP4 connection */
-      u8 proto;			/**< Protocol id */
-      u32 fib_index;		/**< Network namespace */
-    };
-    /*
-     * Opaque connection ID
-     */
-    u8 opaque_conn_id[42];
-  };
+  /*
+   * Setup
+   */
+  u32 (*start_listen) (u32 session_index, transport_endpoint_t * lcl);
+  u32 (*stop_listen) (u32 conn_index);
+  int (*connect) (transport_endpoint_cfg_t * rmt);
+  void (*close) (u32 conn_index, u32 thread_index);
+  void (*cleanup) (u32 conn_index, u32 thread_index);
+  clib_error_t *(*enable) (vlib_main_t * vm, u8 is_en);
 
-  u32 s_index;			/**< Parent session index */
-  u32 c_index;			/**< Connection index in transport pool */
-  u32 thread_index;		/**< Worker-thread index */
+  /*
+   * Transmission
+   */
 
-  /*fib_node_index_t rmt_fei;
-     dpo_id_t rmt_dpo; */
+  u32 (*push_header) (transport_connection_t * tconn, vlib_buffer_t * b);
+  u16 (*send_mss) (transport_connection_t * tc);
+  u32 (*send_space) (transport_connection_t * tc);
+  u32 (*tx_fifo_offset) (transport_connection_t * tc);
+  void (*update_time) (f64 time_now, u8 thread_index);
+  void (*flush_data) (transport_connection_t *tconn);
 
-  u8 flags;			/**< Transport specific flags */
-  transport_stats_t stats;	/**< Transport connection stats */
-  spacer_t pacer;		/**< Simple transport pacer */
+  /*
+   * Connection retrieval
+   */
+  transport_connection_t *(*get_connection) (u32 conn_idx, u32 thread_idx);
+  transport_connection_t *(*get_listener) (u32 conn_index);
+  transport_connection_t *(*get_half_open) (u32 conn_index);
 
-#if TRANSPORT_DEBUG
-  elog_track_t elog_track;	/**< Event logging */
-  u32 cc_stat_tstamp;		/**< CC stats timestamp */
-#endif
+  /*
+   * Format
+   */
+  u8 *(*format_connection) (u8 * s, va_list * args);
+  u8 *(*format_listener) (u8 * s, va_list * args);
+  u8 *(*format_half_open) (u8 * s, va_list * args);
 
-  /** Macros for 'derived classes' where base is named "connection" */
-#define c_lcl_ip connection.lcl_ip
-#define c_rmt_ip connection.rmt_ip
-#define c_lcl_ip4 connection.lcl_ip.ip4
-#define c_rmt_ip4 connection.rmt_ip.ip4
-#define c_lcl_ip6 connection.lcl_ip.ip6
-#define c_rmt_ip6 connection.rmt_ip.ip6
-#define c_lcl_port connection.lcl_port
-#define c_rmt_port connection.rmt_port
-#define c_proto connection.proto
-#define c_fib_index connection.fib_index
-#define c_s_index connection.s_index
-#define c_c_index connection.c_index
-#define c_is_ip4 connection.is_ip4
-#define c_thread_index connection.thread_index
-#define c_elog_track connection.elog_track
-#define c_cc_stat_tstamp connection.cc_stat_tstamp
-#define c_rmt_fei connection.rmt_fei
-#define c_rmt_dpo connection.rmt_dpo
-#define c_opaque_id connection.opaque_conn_id
-#define c_stats connection.stats
-#define c_pacer connection.pacer
-#define c_flags connection.flags
-} transport_connection_t;
+  /*
+   * Properties
+   */
+  transport_tx_fn_type_t tx_type;
+  transport_service_type_t service_type;
+} transport_proto_vft_t;
+/* *INDENT-ON* */
 
-#define TRANSPORT_CONNECTION_F_IS_TX_PACED	1 << 0
+extern transport_proto_vft_t *tp_vfts;
 
-typedef enum _transport_proto
+#define transport_proto_foreach(VAR, BODY)			\
+do {								\
+    for (VAR = 0; VAR < vec_len (tp_vfts); VAR++)		\
+      if (tp_vfts[VAR].push_header != 0)			\
+	do { BODY; } while (0);					\
+} while (0)
+
+int transport_connect (transport_proto_t tp, transport_endpoint_cfg_t * tep);
+void transport_close (transport_proto_t tp, u32 conn_index, u8 thread_index);
+u32 transport_start_listen (transport_proto_t tp, u32 session_index,
+			    transport_endpoint_t * tep);
+u32 transport_stop_listen (transport_proto_t tp, u32 conn_index);
+void transport_cleanup (transport_proto_t tp, u32 conn_index,
+			u8 thread_index);
+
+static inline transport_connection_t *
+transport_get_connection (transport_proto_t tp, u32 conn_index,
+			  u8 thread_index)
 {
-  TRANSPORT_PROTO_TCP,
-  TRANSPORT_PROTO_UDP,
-  TRANSPORT_PROTO_SCTP,
-  TRANSPORT_PROTO_NONE,
-  TRANSPORT_PROTO_TLS,
-  TRANSPORT_PROTO_UDPC,
-  TRANSPORT_N_PROTO
-} transport_proto_t;
-
-u8 *format_transport_proto (u8 * s, va_list * args);
-u8 *format_transport_proto_short (u8 * s, va_list * args);
-u8 *format_transport_connection (u8 * s, va_list * args);
-u8 *format_transport_listen_connection (u8 * s, va_list * args);
-u8 *format_transport_half_open_connection (u8 * s, va_list * args);
-
-uword unformat_transport_proto (unformat_input_t * input, va_list * args);
-
-#define foreach_transport_endpoint_fields				\
-  _(ip46_address_t, ip) /**< ip address in net order */			\
-  _(u16, port)		/**< port in net order */			\
-  _(u8, is_ip4)		/**< set if ip4 */				\
-  _(u32, sw_if_index) 	/**< interface endpoint is associated with  */	\
-  _(u32, fib_index)	/**< fib table endpoint is associated with */	\
-
-typedef struct transport_endpoint_
-{
-#define _(type, name) type name;
-  foreach_transport_endpoint_fields
-#undef _
-} transport_endpoint_t;
-
-#define foreach_transport_endpoint_cfg_fields				\
-  foreach_transport_endpoint_fields					\
-  _(transport_endpoint_t, peer)						\
-
-typedef struct transport_endpoint_pair_
-{
-#define _(type, name) type name;
-  foreach_transport_endpoint_cfg_fields
-#undef _
-} transport_endpoint_cfg_t;
-
-typedef clib_bihash_24_8_t transport_endpoint_table_t;
-
-#define ENDPOINT_INVALID_INDEX ((u32)~0)
-
-always_inline u8
-transport_connection_fib_proto (transport_connection_t * tc)
-{
-  return tc->is_ip4 ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6;
+  return tp_vfts[tp].get_connection (conn_index, thread_index);
 }
 
-always_inline u8
-transport_endpoint_fib_proto (transport_endpoint_t * tep)
+static inline transport_connection_t *
+transport_get_listener (transport_proto_t tp, u32 conn_index)
 {
-  return tep->is_ip4 ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6;
+  return tp_vfts[tp].get_listener (conn_index);
 }
 
+static inline transport_connection_t *
+transport_get_half_open (transport_proto_t tp, u32 conn_index)
+{
+  return tp_vfts[tp].get_half_open (conn_index);
+}
+
+void transport_register_protocol (transport_proto_t transport_proto,
+				  const transport_proto_vft_t * vft,
+				  fib_protocol_t fib_proto, u32 output_node);
+transport_proto_vft_t *transport_protocol_get_vft (transport_proto_t tp);
+void transport_update_time (f64 time_now, u8 thread_index);
+
 int transport_alloc_local_port (u8 proto, ip46_address_t * ip);
 int transport_alloc_local_endpoint (u8 proto, transport_endpoint_cfg_t * rmt,
 				    ip46_address_t * lcl_addr,
 				    u16 * lcl_port);
 void transport_endpoint_cleanup (u8 proto, ip46_address_t * lcl_ip, u16 port);
-u8 transport_protocol_is_cl (transport_proto_t tp);
-transport_service_type_t transport_protocol_service_type (transport_proto_t);
-transport_tx_fn_type_t transport_protocol_tx_fn_type (transport_proto_t tp);
+void transport_enable_disable (vlib_main_t * vm, u8 is_en);
 void transport_init (void);
 
-#endif /* VNET_VNET_URI_TRANSPORT_H_ */
+always_inline u32
+transport_elog_track_index (transport_connection_t * tc)
+{
+#if TRANSPORT_DEBUG
+  return tc->elog_track.track_index_plus_one - 1;
+#else
+  return ~0;
+#endif
+}
+
+void transport_connection_tx_pacer_reset (transport_connection_t * tc,
+					  u32 rate_bytes_per_sec,
+					  u32 initial_bucket, u64 time_now);
+/**
+ * Initialize tx pacer for connection
+ *
+ * @param tc				transport connection
+ * @param rate_bytes_per_second		initial byte rate
+ * @param burst_bytes			initial burst size in bytes
+ */
+void transport_connection_tx_pacer_init (transport_connection_t * tc,
+					 u32 rate_bytes_per_sec,
+					 u32 initial_bucket);
+
+/**
+ * Update tx pacer pacing rate
+ *
+ * @param tc			transport connection
+ * @param bytes_per_sec		new pacing rate
+ */
+void transport_connection_tx_pacer_update (transport_connection_t * tc,
+					   u64 bytes_per_sec);
+
+/**
+ * Get maximum tx burst allowed for transport connection
+ *
+ * @param tc		transport connection
+ * @param time_now	current cpu time as returned by @ref clib_cpu_time_now
+ * @param mss		transport's mss
+ */
+u32 transport_connection_snd_space (transport_connection_t * tc,
+				    u64 time_now, u16 mss);
+
+u32 transport_connection_tx_pacer_burst (transport_connection_t * tc,
+					 u64 time_now);
+
+/**
+ * Initialize period for tx pacers
+ *
+ * Defines a unit of time with respect to number of cpu cycles that is to
+ * be used by all tx pacers.
+ */
+void transport_init_tx_pacers_period (void);
+
+/**
+ * Check if transport connection is paced
+ */
+always_inline u8
+transport_connection_is_tx_paced (transport_connection_t * tc)
+{
+  return (tc->flags & TRANSPORT_CONNECTION_F_IS_TX_PACED);
+}
+
+u8 *format_transport_pacer (u8 * s, va_list * args);
+
+/**
+ * Update tx byte stats for transport connection
+ *
+ * If tx pacing is enabled, this also updates pacer bucket to account for the
+ * amount of bytes that have been sent.
+ *
+ * @param tc		transport connection
+ * @param pkts		packets recently sent
+ * @param bytes		bytes recently sent
+ */
+void transport_connection_update_tx_stats (transport_connection_t * tc,
+					   u32 bytes);
+
+void
+transport_connection_tx_pacer_update_bytes (transport_connection_t * tc,
+					    u32 bytes);
+
+#endif /* SRC_VNET_SESSION_TRANSPORT_H_ */
 
 /*
  * fd.io coding-style-patch-verification: ON
diff --git a/src/vnet/session/transport_interface.h b/src/vnet/session/transport_interface.h
deleted file mode 100644
index 1230486..0000000
--- a/src/vnet/session/transport_interface.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (c) 2017-2019 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef SRC_VNET_SESSION_TRANSPORT_INTERFACE_H_
-#define SRC_VNET_SESSION_TRANSPORT_INTERFACE_H_
-
-#include <vnet/vnet.h>
-#include <vnet/session/transport.h>
-
-/*
- * Transport protocol virtual function table
- */
-/* *INDENT-OFF* */
-typedef struct _transport_proto_vft
-{
-  /*
-   * Setup
-   */
-  u32 (*bind) (u32 session_index, transport_endpoint_t * lcl);
-  u32 (*unbind) (u32);
-  int (*open) (transport_endpoint_cfg_t * rmt);
-  void (*close) (u32 conn_index, u32 thread_index);
-  void (*cleanup) (u32 conn_index, u32 thread_index);
-  clib_error_t *(*enable) (vlib_main_t * vm, u8 is_en);
-
-  /*
-   * Transmission
-   */
-
-  u32 (*push_header) (transport_connection_t * tconn, vlib_buffer_t * b);
-  u16 (*send_mss) (transport_connection_t * tc);
-  u32 (*send_space) (transport_connection_t * tc);
-  u32 (*tx_fifo_offset) (transport_connection_t * tc);
-  void (*update_time) (f64 time_now, u8 thread_index);
-  void (*flush_data) (transport_connection_t *tconn);
-
-  /*
-   * Connection retrieval
-   */
-  transport_connection_t *(*get_connection) (u32 conn_idx, u32 thread_idx);
-  transport_connection_t *(*get_listener) (u32 conn_index);
-  transport_connection_t *(*get_half_open) (u32 conn_index);
-
-  /*
-   * Format
-   */
-  u8 *(*format_connection) (u8 * s, va_list * args);
-  u8 *(*format_listener) (u8 * s, va_list * args);
-  u8 *(*format_half_open) (u8 * s, va_list * args);
-
-  /*
-   * Properties
-   */
-  transport_tx_fn_type_t tx_type;
-  transport_service_type_t service_type;
-} transport_proto_vft_t;
-/* *INDENT-ON* */
-
-extern transport_proto_vft_t *tp_vfts;
-
-#define transport_proto_foreach(VAR, BODY)			\
-do {								\
-    for (VAR = 0; VAR < vec_len (tp_vfts); VAR++)		\
-      if (tp_vfts[VAR].push_header != 0)			\
-	do { BODY; } while (0);					\
-} while (0)
-
-void transport_register_protocol (transport_proto_t transport_proto,
-				  const transport_proto_vft_t * vft,
-				  fib_protocol_t fib_proto, u32 output_node);
-transport_proto_vft_t *transport_protocol_get_vft (transport_proto_t tp);
-void transport_update_time (f64 time_now, u8 thread_index);
-transport_connection_t *transport_get_connection (transport_proto_t tp,
-						  u32 conn_index,
-						  u8 thread_index);
-transport_connection_t *transport_get_listener (transport_proto_t tp,
-						u32 conn_index);
-void transport_enable_disable (vlib_main_t * vm, u8 is_en);
-
-always_inline u32
-transport_elog_track_index (transport_connection_t * tc)
-{
-#if TRANSPORT_DEBUG
-  return tc->elog_track.track_index_plus_one - 1;
-#else
-  return ~0;
-#endif
-}
-
-void transport_connection_tx_pacer_reset (transport_connection_t * tc,
-					  u32 rate_bytes_per_sec,
-					  u32 initial_bucket, u64 time_now);
-/**
- * Initialize tx pacer for connection
- *
- * @param tc				transport connection
- * @param rate_bytes_per_second		initial byte rate
- * @param burst_bytes			initial burst size in bytes
- */
-void transport_connection_tx_pacer_init (transport_connection_t * tc,
-					 u32 rate_bytes_per_sec,
-					 u32 initial_bucket);
-
-/**
- * Update tx pacer pacing rate
- *
- * @param tc			transport connection
- * @param bytes_per_sec		new pacing rate
- */
-void transport_connection_tx_pacer_update (transport_connection_t * tc,
-					   u64 bytes_per_sec);
-
-/**
- * Get maximum tx burst allowed for transport connection
- *
- * @param tc		transport connection
- * @param time_now	current cpu time as returned by @ref clib_cpu_time_now
- * @param mss		transport's mss
- */
-u32 transport_connection_snd_space (transport_connection_t * tc,
-				    u64 time_now, u16 mss);
-
-u32 transport_connection_tx_pacer_burst (transport_connection_t * tc,
-					 u64 time_now);
-
-/**
- * Initialize period for tx pacers
- *
- * Defines a unit of time with respect to number of cpu cycles that is to
- * be used by all tx pacers.
- */
-void transport_init_tx_pacers_period (void);
-
-/**
- * Check if transport connection is paced
- */
-always_inline u8
-transport_connection_is_tx_paced (transport_connection_t * tc)
-{
-  return (tc->flags & TRANSPORT_CONNECTION_F_IS_TX_PACED);
-}
-
-u8 *format_transport_pacer (u8 * s, va_list * args);
-
-/**
- * Update tx byte stats for transport connection
- *
- * If tx pacing is enabled, this also updates pacer bucket to account for the
- * amount of bytes that have been sent.
- *
- * @param tc		transport connection
- * @param pkts		packets recently sent
- * @param bytes		bytes recently sent
- */
-void transport_connection_update_tx_stats (transport_connection_t * tc,
-					   u32 bytes);
-
-void
-transport_connection_tx_pacer_update_bytes (transport_connection_t * tc,
-					    u32 bytes);
-
-#endif /* SRC_VNET_SESSION_TRANSPORT_INTERFACE_H_ */
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/src/vnet/session/transport_types.h b/src/vnet/session/transport_types.h
new file mode 100644
index 0000000..d309c58
--- /dev/null
+++ b/src/vnet/session/transport_types.h
@@ -0,0 +1,197 @@
+/*
+ * Copyright (c) 2016-2019 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef VNET_VNET_URI_TRANSPORT_TYPES_H_
+#define VNET_VNET_URI_TRANSPORT_TYPES_H_
+
+#include <vnet/vnet.h>
+#include <vnet/ip/ip.h>
+#include <vnet/tcp/tcp_debug.h>
+
+#define TRANSPORT_MAX_HDRS_LEN    100	/* Max number of bytes for headers */
+
+typedef enum transport_dequeue_type_
+{
+  TRANSPORT_TX_PEEK,		/**< reliable transport protos */
+  TRANSPORT_TX_DEQUEUE,		/**< unreliable transport protos */
+  TRANSPORT_TX_INTERNAL,	/**< apps acting as transports */
+  TRANSPORT_TX_DGRAM,		/**< datagram mode */
+  TRANSPORT_TX_N_FNS
+} transport_tx_fn_type_t;
+
+typedef enum transport_service_type_
+{
+  TRANSPORT_SERVICE_VC,		/**< virtual circuit service */
+  TRANSPORT_SERVICE_CL,		/**< connectionless service */
+  TRANSPORT_SERVICE_APP,	/**< app transport service */
+  TRANSPORT_N_SERVICES
+} transport_service_type_t;
+
+typedef struct _transport_stats
+{
+  u64 tx_bytes;
+} transport_stats_t;
+
+typedef struct _spacer
+{
+  u64 bucket;
+  u32 max_burst_size;
+  f32 tokens_per_period;
+  u64 last_update;
+} spacer_t;
+
+/*
+ * Protocol independent transport properties associated to a session
+ */
+typedef struct _transport_connection
+{
+  /** Connection ID */
+  union
+  {
+    /*
+     * Network connection ID tuple
+     */
+    struct
+    {
+      ip46_address_t rmt_ip;	/**< Remote IP */
+      ip46_address_t lcl_ip;	/**< Local IP */
+      u16 rmt_port;		/**< Remote port */
+      u16 lcl_port;		/**< Local port */
+      u8 is_ip4;		/**< Flag if IP4 connection */
+      u8 proto;			/**< Protocol id */
+      u32 fib_index;		/**< Network namespace */
+    };
+    /*
+     * Opaque connection ID
+     */
+    u8 opaque_conn_id[42];
+  };
+
+  u32 s_index;			/**< Parent session index */
+  u32 c_index;			/**< Connection index in transport pool */
+  u32 thread_index;		/**< Worker-thread index */
+
+  /*fib_node_index_t rmt_fei;
+     dpo_id_t rmt_dpo; */
+
+  u8 flags;			/**< Transport specific flags */
+  transport_stats_t stats;	/**< Transport connection stats */
+  spacer_t pacer;		/**< Simple transport pacer */
+
+#if TRANSPORT_DEBUG
+  elog_track_t elog_track;	/**< Event logging */
+  u32 cc_stat_tstamp;		/**< CC stats timestamp */
+#endif
+
+  /** Macros for 'derived classes' where base is named "connection" */
+#define c_lcl_ip connection.lcl_ip
+#define c_rmt_ip connection.rmt_ip
+#define c_lcl_ip4 connection.lcl_ip.ip4
+#define c_rmt_ip4 connection.rmt_ip.ip4
+#define c_lcl_ip6 connection.lcl_ip.ip6
+#define c_rmt_ip6 connection.rmt_ip.ip6
+#define c_lcl_port connection.lcl_port
+#define c_rmt_port connection.rmt_port
+#define c_proto connection.proto
+#define c_fib_index connection.fib_index
+#define c_s_index connection.s_index
+#define c_c_index connection.c_index
+#define c_is_ip4 connection.is_ip4
+#define c_thread_index connection.thread_index
+#define c_elog_track connection.elog_track
+#define c_cc_stat_tstamp connection.cc_stat_tstamp
+#define c_rmt_fei connection.rmt_fei
+#define c_rmt_dpo connection.rmt_dpo
+#define c_opaque_id connection.opaque_conn_id
+#define c_stats connection.stats
+#define c_pacer connection.pacer
+#define c_flags connection.flags
+} transport_connection_t;
+
+#define TRANSPORT_CONNECTION_F_IS_TX_PACED	1 << 0
+
+typedef enum _transport_proto
+{
+  TRANSPORT_PROTO_TCP,
+  TRANSPORT_PROTO_UDP,
+  TRANSPORT_PROTO_SCTP,
+  TRANSPORT_PROTO_NONE,
+  TRANSPORT_PROTO_TLS,
+  TRANSPORT_PROTO_UDPC,
+  TRANSPORT_N_PROTO
+} transport_proto_t;
+
+u8 *format_transport_proto (u8 * s, va_list * args);
+u8 *format_transport_proto_short (u8 * s, va_list * args);
+u8 *format_transport_connection (u8 * s, va_list * args);
+u8 *format_transport_listen_connection (u8 * s, va_list * args);
+u8 *format_transport_half_open_connection (u8 * s, va_list * args);
+
+uword unformat_transport_proto (unformat_input_t * input, va_list * args);
+
+#define foreach_transport_endpoint_fields				\
+  _(ip46_address_t, ip) /**< ip address in net order */			\
+  _(u16, port)		/**< port in net order */			\
+  _(u8, is_ip4)		/**< set if ip4 */				\
+  _(u32, sw_if_index) 	/**< interface endpoint is associated with  */	\
+  _(u32, fib_index)	/**< fib table endpoint is associated with */	\
+
+typedef struct transport_endpoint_
+{
+#define _(type, name) type name;
+  foreach_transport_endpoint_fields
+#undef _
+} transport_endpoint_t;
+
+#define foreach_transport_endpoint_cfg_fields				\
+  foreach_transport_endpoint_fields					\
+  _(transport_endpoint_t, peer)						\
+
+typedef struct transport_endpoint_pair_
+{
+#define _(type, name) type name;
+  foreach_transport_endpoint_cfg_fields
+#undef _
+} transport_endpoint_cfg_t;
+
+typedef clib_bihash_24_8_t transport_endpoint_table_t;
+
+#define ENDPOINT_INVALID_INDEX ((u32)~0)
+
+always_inline u8
+transport_connection_fib_proto (transport_connection_t * tc)
+{
+  return tc->is_ip4 ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6;
+}
+
+always_inline u8
+transport_endpoint_fib_proto (transport_endpoint_t * tep)
+{
+  return tep->is_ip4 ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6;
+}
+
+u8 transport_protocol_is_cl (transport_proto_t tp);
+transport_service_type_t transport_protocol_service_type (transport_proto_t);
+transport_tx_fn_type_t transport_protocol_tx_fn_type (transport_proto_t tp);
+
+#endif /* VNET_VNET_URI_TRANSPORT_TYPES_H_ */
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "gnu")
+ * End:
+ */