-/* *INDENT-OFF* */
-typedef CLIB_PACKED (struct {
- union
- {
- svm_fifo_t * fifo;
- u64 session_handle;
- rpc_args_t rpc_args;
- };
- u8 event_type;
- u8 postponed;
-}) session_fifo_event_t;
-/* *INDENT-ON* */
-
-/* Forward definition */
-typedef struct _session_manager_main session_manager_main_t;
-
-typedef int
- (session_fifo_rx_fn) (vlib_main_t * vm, vlib_node_runtime_t * node,
- session_manager_main_t * smm,
- session_fifo_event_t * e0, stream_session_t * s0,
- u32 thread_index, int *n_tx_pkts);
+typedef struct session_ctrl_evt_data_
+{
+ u8 data[SESSION_CTRL_MSG_MAX_SIZE];
+} session_evt_ctrl_data_t;
+
+typedef struct session_worker_
+{
+ CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
+
+ /** Worker session pool */
+ session_t *sessions;
+
+ /** vpp event message queue for worker */
+ svm_msg_q_t *vpp_event_queue;
+
+ /** vlib_time_now last time around the track */
+ clib_time_type_t last_vlib_time;
+
+ /** vlib_time_now rounded to us precision and as u64 */
+ clib_us_time_t last_vlib_us_time;
+
+ /** Convenience pointer to this worker's vlib_main */
+ vlib_main_t *vm;
+
+ /** Per-proto vector of sessions to enqueue */
+ u32 **session_to_enqueue;
+
+ /** Context for session tx */
+ session_tx_context_t ctx;
+
+ /** Vector of tx buffer free lists */
+ u32 *tx_buffers;
+
+ /** Pool of session event list elements */
+ session_evt_elt_t *event_elts;
+
+ /** Pool of ctrl events data buffers */
+ session_evt_ctrl_data_t *ctrl_evts_data;
+
+ /** Head of control events list */
+ clib_llist_index_t ctrl_head;
+
+ /** Head of list of elements */
+ clib_llist_index_t new_head;
+
+ /** Head of list of pending events */
+ clib_llist_index_t old_head;
+
+ /** Peekers rw lock */
+ clib_rwlock_t peekers_rw_locks;
+
+ /** Vector of buffers to be sent */
+ u32 *pending_tx_buffers;
+
+ /** Vector of nexts for the pending tx buffers */
+ u16 *pending_tx_nexts;
+
+#if SESSION_DEBUG
+ /** last event poll time by thread */
+ clib_time_type_t last_event_poll;
+#endif
+} session_worker_t;
+
+typedef int (session_fifo_rx_fn) (session_worker_t * wrk,
+ vlib_node_runtime_t * node,
+ session_evt_elt_t * e, int *n_tx_packets);