session: separate local session logic
[vpp.git] / src / vnet / session / session.h
index 6ae901c..6a52be3 100644 (file)
 
 #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)
-#define SESSION_LOCAL_HANDLE_PREFIX 0x7FFFFFFF
-
-/* 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,
-  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_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 enum
-{
-  SESSION_MQ_IO_EVT_RING,
-  SESSION_MQ_CTRL_EVT_RING,
-  SESSION_MQ_N_RINGS
-} session_mq_rings_e;
 
 #define foreach_session_input_error                                            \
 _(NO_SESSION, "No session drops")                                       \
@@ -100,59 +43,6 @@ typedef enum
     SESSION_N_ERROR,
 } session_error_t;
 
-typedef struct
-{
-  void *fp;
-  void *arg;
-} session_rpc_args_t;
-
-typedef u64 session_handle_t;
-
-/* *INDENT-OFF* */
-typedef struct
-{
-  u8 event_type;
-  u8 postponed;
-  union
-  {
-    svm_fifo_t *fifo;
-    session_handle_t session_handle;
-    session_rpc_args_t rpc_args;
-    struct
-    {
-      u8 data[0];
-    };
-  };
-} __clib_packed session_event_t;
-/* *INDENT-ON* */
-
-#define SESSION_MSG_NULL { }
-
-typedef struct session_dgram_pre_hdr_
-{
-  u32 data_length;
-  u32 data_offset;
-} session_dgram_pre_hdr_t;
-
-/* *INDENT-OFF* */
-typedef CLIB_PACKED (struct session_dgram_header_
-{
-  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");
-
 typedef struct session_tx_context_
 {
   CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
@@ -264,7 +154,7 @@ typedef struct session_manager_main_
   /** Session ssvm segment configs*/
   uword session_baseva;
   uword session_va_space_size;
-  u32 evt_qs_segment_size;
+  uword evt_qs_segment_size;
   u8 evt_qs_use_memfd_seg;
 
   /** Session table size parameters */
@@ -301,21 +191,6 @@ extern vlib_node_registration_t session_queue_process_node;
 #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)
 {
@@ -331,7 +206,6 @@ stream_session_is_valid (u32 si, u8 thread_index)
 }
 
 session_t *session_alloc (u32 thread_index);
-int session_alloc_fifos (segment_manager_t * sm, session_t * s);
 void session_free (session_t * s);
 void session_free_w_fifos (session_t * s);
 
@@ -358,32 +232,6 @@ session_get_if_valid (u64 si, u32 thread_index)
                            si);
 }
 
-always_inline session_handle_t
-session_handle (session_t * s)
-{
-  return ((u64) s->thread_index << 32) | (u64) s->session_index;
-}
-
-always_inline u32
-session_index_from_handle (session_handle_t handle)
-{
-  return handle & 0xFFFFFFFF;
-}
-
-always_inline u32
-session_thread_from_handle (session_handle_t handle)
-{
-  return handle >> 32;
-}
-
-always_inline void
-session_parse_handle (session_handle_t handle, u32 * index,
-                     u32 * thread_index)
-{
-  *index = session_index_from_handle (handle);
-  *thread_index = session_thread_from_handle (handle);
-}
-
 always_inline session_t *
 session_get_from_handle (session_handle_t handle)
 {
@@ -401,45 +249,6 @@ session_get_from_handle_if_valid (session_handle_t handle)
   return session_get_if_valid (session_index, thread_index);
 }
 
-always_inline u8
-session_handle_is_local (session_handle_t handle)
-{
-  if ((handle >> 32) == SESSION_LOCAL_HANDLE_PREFIX)
-    return 1;
-  return 0;
-}
-
-always_inline transport_proto_t
-session_type_transport_proto (session_type_t st)
-{
-  return (st >> 1);
-}
-
-always_inline u8
-session_type_is_ip4 (session_type_t st)
-{
-  return (st & 1);
-}
-
-always_inline transport_proto_t
-session_get_transport_proto (session_t * s)
-{
-  return (s->session_type >> 1);
-}
-
-always_inline fib_protocol_t
-session_get_fib_proto (session_t * s)
-{
-  u8 is_ip4 = s->session_type & 1;
-  return (is_ip4 ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6);
-}
-
-always_inline session_type_t
-session_type_from_proto_and_ip (transport_proto_t proto, u8 is_ip4)
-{
-  return (proto << 1 | is_ip4);
-}
-
 always_inline u64
 session_segment_handle (session_t * s)
 {
@@ -453,16 +262,6 @@ session_segment_handle (session_t * s)
                                              f->segment_index);
 }
 
-always_inline u8
-session_has_transport (session_t * s)
-{
-  return (session_get_transport_proto (s) != TRANSPORT_PROTO_NONE);
-}
-
-transport_service_type_t session_transport_service_type (session_t *);
-transport_tx_fn_type_t session_transport_tx_fn_type (session_t *);
-u8 session_tx_is_dgram (session_t * s);
-
 /**
  * Acquires a lock that blocks a session pool from expanding.
  *
@@ -515,53 +314,6 @@ session_get_from_handle_safe (u64 handle)
     }
 }
 
-always_inline u32
-transport_max_rx_enqueue (transport_connection_t * tc)
-{
-  session_t *s = session_get (tc->s_index, tc->thread_index);
-  return svm_fifo_max_enqueue (s->rx_fifo);
-}
-
-always_inline u32
-transport_max_tx_dequeue (transport_connection_t * tc)
-{
-  session_t *s = session_get (tc->s_index, tc->thread_index);
-  return svm_fifo_max_dequeue (s->tx_fifo);
-}
-
-always_inline u32
-transport_rx_fifo_size (transport_connection_t * tc)
-{
-  session_t *s = session_get (tc->s_index, tc->thread_index);
-  return s->rx_fifo->nitems;
-}
-
-always_inline u32
-transport_tx_fifo_size (transport_connection_t * tc)
-{
-  session_t *s = session_get (tc->s_index, tc->thread_index);
-  return s->tx_fifo->nitems;
-}
-
-always_inline u8
-transport_rx_fifo_has_ooo_data (transport_connection_t * tc)
-{
-  session_t *s = session_get (tc->c_index, tc->thread_index);
-  return svm_fifo_has_ooo_data (s->rx_fifo);
-}
-
-always_inline f64
-transport_dispatch_period (u32 thread_index)
-{
-  return session_manager_main.wrk[thread_index].dispatch_period;
-}
-
-always_inline f64
-transport_time_now (u32 thread_index)
-{
-  return session_manager_main.wrk[thread_index].last_vlib_time;
-}
-
 always_inline u32
 session_get_index (session_t * s)
 {
@@ -589,61 +341,108 @@ session_clone_safe (u32 session_index, u32 thread_index)
   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);
 
-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);
+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);
+u32 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);
+int session_stream_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,
+int session_stream_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);
-
+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);
+  return svm_fifo_max_enqueue (s->rx_fifo);
+}
+
+always_inline u32
+transport_max_tx_dequeue (transport_connection_t * tc)
+{
+  session_t *s = session_get (tc->s_index, tc->thread_index);
+  return svm_fifo_max_dequeue (s->tx_fifo);
+}
+
+always_inline u32
+transport_rx_fifo_size (transport_connection_t * tc)
+{
+  session_t *s = session_get (tc->s_index, tc->thread_index);
+  return s->rx_fifo->nitems;
+}
+
+always_inline u32
+transport_tx_fifo_size (transport_connection_t * tc)
+{
+  session_t *s = session_get (tc->s_index, tc->thread_index);
+  return s->tx_fifo->nitems;
+}
+
+always_inline u8
+transport_rx_fifo_has_ooo_data (transport_connection_t * tc)
+{
+  session_t *s = session_get (tc->c_index, tc->thread_index);
+  return svm_fifo_has_ooo_data (s->rx_fifo);
+}
+
+always_inline f64
+transport_dispatch_period (u32 thread_index)
+{
+  return session_manager_main.wrk[thread_index].dispatch_period;
+}
+
+always_inline f64
+transport_time_now (u32 thread_index)
+{
+  return session_manager_main.wrk[thread_index].last_vlib_time;
+}
+
 always_inline void
 transport_add_tx_event (transport_connection_t * tc)
 {
@@ -653,16 +452,9 @@ transport_add_tx_event (transport_connection_t * tc)
   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)
@@ -685,7 +477,7 @@ listen_session_parse_handle (session_handle_t handle, u32 * index,
 }
 
 always_inline session_t *
-listen_session_new (u8 thread_index, session_type_t type)
+listen_session_alloc (u8 thread_index, session_type_t type)
 {
   session_t *s;
   s = session_alloc (thread_index);
@@ -695,13 +487,13 @@ listen_session_new (u8 thread_index, session_type_t type)
 }
 
 always_inline session_t *
-listen_session_get (u32 index)
+listen_session_get (u32 ls_index)
 {
-  return session_get (index, 0);
+  return session_get (ls_index, 0);
 }
 
 always_inline void
-listen_session_del (session_t * s)
+listen_session_free (session_t * s)
 {
   session_free (s);
 }
@@ -712,7 +504,27 @@ int
 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 ()
@@ -726,7 +538,12 @@ do {                                                                       \
       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__ */