session: support local sessions and deprecate redirects

Memfd backed shared memory segments can only be negotiated over sockets.
For such scenarios, the existing redirect mechanism that establishes
cut-through sessions does not work anymore as the two peer application
do not share such a socket.

This patch adds support for local sessions, as opposed to sessions
backed by a transport connection, in a way that is almost transparent to
the two applications by reusing the existing binary api messages.
Moreover, all segment allocations are now entirely done through the
segment manager valloc, so segment overlaps due to independent
allocations previously required for redirects are completely avoided.
The one notable characteristic of local sessions (cut-through from app
perspective) notification messages is that they carry pointers to two
event queues, one for each app peer, instead of one. For
transport-backed sessions one of the queues can be inferred but for
local session they cannot.

Change-Id: Ia443fb63e2d9d8e43490275062a708f039038175
Signed-off-by: Florin Coras <fcoras@cisco.com>
diff --git a/src/vnet/session/stream_session.h b/src/vnet/session/stream_session.h
index b484efe..57d256c 100644
--- a/src/vnet/session/stream_session.h
+++ b/src/vnet/session/stream_session.h
@@ -36,6 +36,26 @@
   SESSION_STATE_N_STATES,
 } stream_session_state_t;
 
+/* TODO convert to macro once cleanup completed */
+typedef struct app_session_
+{
+  /** fifo pointers. Once allocated, these do not move */
+  svm_fifo_t *server_rx_fifo;
+  svm_fifo_t *server_tx_fifo;
+
+  /** Type */
+  session_type_t session_type;
+
+  /** State */
+  volatile u8 session_state;
+
+  /** Session index in owning pool */
+  u32 session_index;
+
+  /** Application index */
+  u32 app_index;
+} app_session_t;
+
 typedef struct _stream_session_t
 {
   /** fifo pointers. Once allocated, these do not move */
@@ -48,6 +68,12 @@
   /** State */
   volatile u8 session_state;
 
+  /** Session index in per_thread pool */
+  u32 session_index;
+
+  /** stream server pool index */
+  u32 app_index;
+
   u8 thread_index;
 
   /** To avoid n**2 "one event per frame" check */
@@ -56,21 +82,56 @@
   /** svm segment index where fifos were allocated */
   u32 svm_segment_index;
 
-  /** Session index in per_thread pool */
-  u32 session_index;
-
   /** Transport specific */
   u32 connection_index;
 
-  /** stream server pool index */
-  u32 app_index;
-
   /** Parent listener session if the result of an accept */
   u32 listener_index;
 
     CLIB_CACHE_LINE_ALIGN_MARK (pad);
 } stream_session_t;
 
+typedef struct local_session_
+{
+  /** fifo pointers. Once allocated, these do not move */
+  svm_fifo_t *server_rx_fifo;
+  svm_fifo_t *server_tx_fifo;
+
+  /** Type */
+  session_type_t session_type;
+
+  /** State */
+  volatile u8 session_state;
+
+  /** Session index */
+  u32 session_index;
+
+  /** Server index */
+  u32 app_index;
+
+  /** Segment index where fifos were allocated */
+  u32 svm_segment_index;
+
+  u32 listener_index;
+
+  /** Port for connection */
+  u16 port;
+
+  /** Has transport embedded when listener not purely local */
+  session_type_t listener_session_type;
+
+  /**
+   * Client data
+   */
+  u32 client_index;
+  u32 client_opaque;
+
+  u64 server_evt_q;
+  u64 client_evt_q;
+
+    CLIB_CACHE_LINE_ALIGN_MARK (pad);
+} local_session_t;
+
 typedef struct _session_endpoint
 {
   /*