session: refactor local connects
[vpp.git] / src / vnet / session / session_types.h
index 286f4c4..7f1acdd 100644 (file)
@@ -19,7 +19,7 @@
 #include <svm/svm_fifo.h>
 #include <vnet/session/transport_types.h>
 
-#define SESSION_LOCAL_HANDLE_PREFIX 0x7FFFFFFF
+#define SESSION_LISTENER_PREFIX                0x5FFFFFFF
 
 #define foreach_session_endpoint_fields                                \
   foreach_transport_endpoint_cfg_fields                                \
@@ -39,6 +39,8 @@ typedef struct _session_endpoint_cfg
 #undef _
   u32 app_wrk_index;
   u32 opaque;
+  u32 ns_index;
+  u8 original_tp;
   u8 *hostname;
 } session_endpoint_cfg_t;
 
@@ -91,6 +93,19 @@ session_endpoint_fib_proto (session_endpoint_t * sep)
   return sep->is_ip4 ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6;
 }
 
+static inline u8
+session_endpoint_is_local (session_endpoint_t * sep)
+{
+  return (ip_is_zero (&sep->ip, sep->is_ip4)
+         || ip_is_local_host (&sep->ip, sep->is_ip4));
+}
+
+static inline u8
+session_endpoint_is_zero (session_endpoint_t * sep)
+{
+  return ip_is_zero (&sep->ip, sep->is_ip4);
+}
+
 typedef u8 session_type_t;
 typedef u64 session_handle_t;
 
@@ -99,6 +114,7 @@ typedef u64 session_handle_t;
  */
 typedef enum
 {
+  SESSION_STATE_CREATED,
   SESSION_STATE_LISTENING,
   SESSION_STATE_CONNECTING,
   SESSION_STATE_ACCEPTING,
@@ -164,8 +180,8 @@ typedef struct session_
     /** Transport app index for apps acting as transports */
     u32 t_app_index;
 
-    /** Index in listener app's listener db */
-    u32 listener_db_index;
+    /** App listener index */
+    u32 al_index;
 
     /** Opaque, for general use */
     u32 opaque;
@@ -259,111 +275,109 @@ session_parse_handle (session_handle_t handle, u32 * index,
   *thread_index = session_thread_from_handle (handle);
 }
 
-always_inline u8
-session_handle_is_local (session_handle_t handle)
+typedef enum
 {
-  if ((handle >> 32) == SESSION_LOCAL_HANDLE_PREFIX)
-    return 1;
-  return 0;
+  FIFO_EVENT_APP_RX,
+  SESSION_IO_EVT_CT_RX,
+  FIFO_EVENT_APP_TX,
+  SESSION_IO_EVT_CT_TX,
+  SESSION_IO_EVT_TX_FLUSH,
+  FIFO_EVENT_DISCONNECT,
+  FIFO_EVENT_BUILTIN_RX,
+  FIFO_EVENT_BUILTIN_TX,
+  FIFO_EVENT_RPC,
+  SESSION_CTRL_EVT_BOUND,
+  SESSION_CTRL_EVT_UNLISTEN_REPLY,
+  SESSION_CTRL_EVT_ACCEPTED,
+  SESSION_CTRL_EVT_ACCEPTED_REPLY,
+  SESSION_CTRL_EVT_CONNECTED,
+  SESSION_CTRL_EVT_CONNECTED_REPLY,
+  SESSION_CTRL_EVT_DISCONNECTED,
+  SESSION_CTRL_EVT_DISCONNECTED_REPLY,
+  SESSION_CTRL_EVT_RESET,
+  SESSION_CTRL_EVT_RESET_REPLY,
+  SESSION_CTRL_EVT_REQ_WORKER_UPDATE,
+  SESSION_CTRL_EVT_WORKER_UPDATE,
+  SESSION_CTRL_EVT_WORKER_UPDATE_REPLY,
+} session_evt_type_t;
+
+static inline const char *
+fifo_event_type_str (session_evt_type_t et)
+{
+  switch (et)
+    {
+    case FIFO_EVENT_APP_RX:
+      return "FIFO_EVENT_APP_RX";
+    case FIFO_EVENT_APP_TX:
+      return "FIFO_EVENT_APP_TX";
+    case FIFO_EVENT_DISCONNECT:
+      return "FIFO_EVENT_DISCONNECT";
+    case FIFO_EVENT_BUILTIN_RX:
+      return "FIFO_EVENT_BUILTIN_RX";
+    case FIFO_EVENT_RPC:
+      return "FIFO_EVENT_RPC";
+    default:
+      return "UNKNOWN FIFO EVENT";
+    }
 }
 
-typedef struct local_session_
+typedef enum
 {
-  /** fifo pointers. Once allocated, these do not move */
-  svm_fifo_t *rx_fifo;
-  svm_fifo_t *tx_fifo;
-
-  /** Type */
-  session_type_t session_type;
-
-  /** State */
-  volatile u8 session_state;
-
-  /** Session index */
-  u32 session_index;
-
-  /** Server index */
-  u32 app_wrk_index;
-
-  /** Port for connection. Overlaps thread_index/enqueue_epoch */
-  u16 port;
-
-  /** Partly overlaps enqueue_epoch */
-  u8 pad_epoch[7];
-
-  /** Segment index where fifos were allocated */
-  u32 svm_segment_index;
+  SESSION_MQ_IO_EVT_RING,
+  SESSION_MQ_CTRL_EVT_RING,
+  SESSION_MQ_N_RINGS
+} session_mq_rings_e;
 
-  /** Transport listener index. Overlaps connection index */
-  u32 transport_listener_index;
+typedef struct
+{
+  void *fp;
+  void *arg;
+} session_rpc_args_t;
 
+/* *INDENT-OFF* */
+typedef struct
+{
+  u8 event_type;
+  u8 postponed;
   union
   {
-    u32 listener_index;
-    u32 app_index;
-  };
-
-  u32 listener_db_index;
-
-  /** Has transport embedded when listener not purely local */
-  session_type_t listener_session_type;
-
-  /**
-   * Client data
-   */
-  u32 client_wrk_index;
-  u32 client_opaque;
-
-  u64 server_evt_q;
-  u64 client_evt_q;
-
-    CLIB_CACHE_LINE_ALIGN_MARK (pad);
-} local_session_t;
-
-always_inline u32
-local_session_id (local_session_t * ls)
-{
-  ASSERT (ls->session_index < (2 << 16));
-  u32 app_or_wrk_index;
-
-  if (ls->session_state == SESSION_STATE_LISTENING)
-    {
-      ASSERT (ls->app_index < (2 << 16));
-      app_or_wrk_index = ls->app_index;
-    }
-  else
+    svm_fifo_t *fifo;
+    session_handle_t session_handle;
+    session_rpc_args_t rpc_args;
+    struct
     {
-      ASSERT (ls->app_wrk_index < (2 << 16));
-      app_or_wrk_index = ls->app_wrk_index;
-    }
+      u8 data[0];
+    };
+  };
+} __clib_packed session_event_t;
+/* *INDENT-ON* */
 
-  return ((u32) app_or_wrk_index << 16 | (u32) ls->session_index);
-}
+#define SESSION_MSG_NULL { }
 
-always_inline void
-local_session_parse_id (u32 ls_id, u32 * app_or_wrk, u32 * session_index)
+typedef struct session_dgram_pre_hdr_
 {
-  *app_or_wrk = ls_id >> 16;
-  *session_index = ls_id & 0xFF;
-}
+  u32 data_length;
+  u32 data_offset;
+} session_dgram_pre_hdr_t;
 
-always_inline void
-local_session_parse_handle (session_handle_t handle, u32 * app_or_wrk_index,
-                           u32 * session_index)
+/* *INDENT-OFF* */
+typedef CLIB_PACKED (struct session_dgram_header_
 {
-  u32 bottom;
-  ASSERT ((handle >> 32) == SESSION_LOCAL_HANDLE_PREFIX);
-  bottom = (handle & 0xFFFFFFFF);
-  local_session_parse_id (bottom, app_or_wrk_index, session_index);
-}
-
-always_inline session_handle_t
-application_local_session_handle (local_session_t * ls)
-{
-  return ((u64) SESSION_LOCAL_HANDLE_PREFIX << 32)
-    | (u64) local_session_id (ls);
-}
-
+  u32 data_length;
+  u32 data_offset;
+  ip46_address_t rmt_ip;
+  ip46_address_t lcl_ip;
+  u16 rmt_port;
+  u16 lcl_port;
+  u8 is_ip4;
+}) session_dgram_hdr_t;
+/* *INDENT-ON* */
+
+#define SESSION_CONN_ID_LEN 37
+#define SESSION_CONN_HDR_LEN 45
+
+STATIC_ASSERT (sizeof (session_dgram_hdr_t) == (SESSION_CONN_ID_LEN + 8),
+              "session conn id wrong length");
 #endif /* SRC_VNET_SESSION_SESSION_TYPES_H_ */
 
 /*