+ /** Per transport rx function that can either dequeue or peek */
+ session_fifo_rx_fn **session_tx_fns;
+
+ /** Per session type output nodes. Could optimize to group nodes by
+ * fib but lookup would then require session type parsing in session node.
+ * Trade memory for speed, for now */
+ u32 *session_type_to_next;
+
+ /*
+ * Config parameters
+ */
+
+ /** Session manager is enabled */
+ u8 is_enabled;
+
+ /** vpp fifo event queue configured length */
+ u32 configured_event_queue_length;
+
+ /** Session ssvm segment configs*/
+ uword session_baseva;
+ uword session_va_space_size;
+ uword evt_qs_segment_size;
+ u8 evt_qs_use_memfd_seg;
+
+ /** Session table size parameters */
+ u32 configured_v4_session_table_buckets;
+ u32 configured_v4_session_table_memory;
+ u32 configured_v4_halfopen_table_buckets;
+ u32 configured_v4_halfopen_table_memory;
+ u32 configured_v6_session_table_buckets;
+ u32 configured_v6_session_table_memory;
+ u32 configured_v6_halfopen_table_buckets;
+ u32 configured_v6_halfopen_table_memory;
+
+ /** Transport table (preallocation) size parameters */
+ u32 local_endpoints_table_memory;
+ u32 local_endpoints_table_buckets;
+
+ /** Preallocate session config parameter */
+ u32 preallocated_sessions;
+
+#if SESSION_DEBUG
+ /**
+ * last event poll time by thread
+ * Debug only. Will cause false cache-line sharing as-is
+ */
+ f64 *last_event_poll_by_thread;
+#endif
+
+} session_main_t;
+
+extern session_main_t session_main;
+extern vlib_node_registration_t session_queue_node;
+extern vlib_node_registration_t session_queue_process_node;
+extern vlib_node_registration_t session_queue_pre_input_node;
+
+#define SESSION_Q_PROCESS_FLUSH_FRAMES 1
+#define SESSION_Q_PROCESS_STOP 2
+
+always_inline u8
+session_is_valid (u32 si, u8 thread_index)
+{
+ session_t *s;
+ s = pool_elt_at_index (session_main.wrk[thread_index].sessions, si);
+ if (s->session_state == SESSION_STATE_CLOSED)
+ return 1;