diff options
Diffstat (limited to 'src/vnet/session/session.c')
-rw-r--r-- | src/vnet/session/session.c | 92 |
1 files changed, 73 insertions, 19 deletions
diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c index 67e7ee39001..ac02281cf5c 100644 --- a/src/vnet/session/session.c +++ b/src/vnet/session/session.c @@ -24,6 +24,7 @@ #include <vnet/fib/ip4_fib.h> #include <vlib/stats/stats.h> #include <vlib/dma/dma.h> +#include <vnet/session/session_rules_table.h> session_main_t session_main; @@ -104,6 +105,22 @@ session_program_tx_io_evt (session_handle_tu_t sh, session_evt_type_t evt_type) } int +session_program_rx_io_evt (session_handle_tu_t sh) +{ + if (sh.thread_index == vlib_get_thread_index ()) + { + session_t *s = session_get_from_handle (sh); + return session_enqueue_notify (s); + } + else + { + return session_send_evt_to_thread ((void *) &sh.session_index, 0, + (u32) sh.thread_index, + SESSION_IO_EVT_BUILTIN_RX); + } +} + +int session_send_ctrl_evt_to_thread (session_t * s, session_evt_type_t evt_type) { /* only events supported are disconnect, shutdown and reset */ @@ -1659,8 +1676,10 @@ session_transport_close (session_t * s) { if (s->session_state == SESSION_STATE_TRANSPORT_CLOSED) session_set_state (s, SESSION_STATE_CLOSED); - /* If transport is already deleted, just free the session */ - else if (s->session_state >= SESSION_STATE_TRANSPORT_DELETED) + /* If transport is already deleted, just free the session. Half-opens + * expected to be already cleaning up at this point */ + else if (s->session_state >= SESSION_STATE_TRANSPORT_DELETED && + !(s->flags & SESSION_F_HALF_OPEN)) session_program_cleanup (s); return; } @@ -1687,7 +1706,8 @@ session_transport_reset (session_t * s) { if (s->session_state == SESSION_STATE_TRANSPORT_CLOSED) session_set_state (s, SESSION_STATE_CLOSED); - else if (s->session_state >= SESSION_STATE_TRANSPORT_DELETED) + else if (s->session_state >= SESSION_STATE_TRANSPORT_DELETED && + !(s->flags & SESSION_F_HALF_OPEN)) session_program_cleanup (s); return; } @@ -1866,7 +1886,8 @@ session_register_update_time_fn (session_update_time_fn fn, u8 is_add) } else { - vec_del1 (smm->update_time_fns, fi_pos); + if (found) + vec_del1 (smm->update_time_fns, fi_pos); } } @@ -1976,7 +1997,8 @@ session_stats_collector_init (void) } static clib_error_t * -session_manager_main_enable (vlib_main_t * vm) +session_manager_main_enable (vlib_main_t *vm, + session_rt_engine_type_t rt_engine_type) { session_main_t *smm = &session_main; vlib_thread_main_t *vtm = vlib_get_thread_main (); @@ -1984,6 +2006,9 @@ session_manager_main_enable (vlib_main_t * vm) session_worker_t *wrk; int i; + if (session_rt_backend_enable_disable (rt_engine_type)) + return clib_error_return (0, "error on enable backend engine"); + /* We only initialize once and do not de-initialized on disable */ if (smm->is_initialized) goto done; @@ -2062,9 +2087,11 @@ done: } static void -session_manager_main_disable (vlib_main_t * vm) +session_manager_main_disable (vlib_main_t *vm, + session_rt_engine_type_t rt_engine_type) { transport_enable_disable (vm, 0 /* is_en */ ); + session_rt_backend_enable_disable (rt_engine_type); } /* in this new callback, cookie hint the index */ @@ -2148,6 +2175,16 @@ session_node_enable_dma (u8 is_en, int n_vlibs) } } +static void +session_main_start_q_process (vlib_main_t *vm, vlib_node_state_t state) +{ + vlib_node_t *n; + + vlib_node_set_state (vm, session_queue_process_node.index, state); + n = vlib_get_node (vm, session_queue_process_node.index); + vlib_start_process (vm, n->runtime_index); +} + void session_node_enable_disable (u8 is_en) { @@ -2155,7 +2192,6 @@ session_node_enable_disable (u8 is_en) u8 state = is_en ? VLIB_NODE_STATE_POLLING : VLIB_NODE_STATE_DISABLED; session_main_t *sm = &session_main; vlib_main_t *vm; - vlib_node_t *n; int n_vlibs, i; n_vlibs = vlib_get_n_threads (); @@ -2169,10 +2205,7 @@ session_node_enable_disable (u8 is_en) if (is_en) { session_main_get_worker (0)->state = SESSION_WRK_INTERRUPT; - vlib_node_set_state (vm, session_queue_process_node.index, - state); - n = vlib_get_node (vm, session_queue_process_node.index); - vlib_start_process (vm, n->runtime_index); + session_main_start_q_process (vm, state); } else { @@ -2195,22 +2228,24 @@ session_node_enable_disable (u8 is_en) } clib_error_t * -vnet_session_enable_disable (vlib_main_t * vm, u8 is_en) +vnet_session_enable_disable (vlib_main_t *vm, + session_enable_disable_args_t *args) { clib_error_t *error = 0; - if (is_en) + + if (args->is_en) { if (session_main.is_enabled) return 0; - error = session_manager_main_enable (vm); - session_node_enable_disable (is_en); + error = session_manager_main_enable (vm, args->rt_engine_type); + session_node_enable_disable (1); } else { session_main.is_enabled = 0; - session_manager_main_disable (vm); - session_node_enable_disable (is_en); + session_manager_main_disable (vm, args->rt_engine_type); + session_node_enable_disable (0); } return error; @@ -2237,10 +2272,15 @@ static clib_error_t * session_main_loop_init (vlib_main_t * vm) { session_main_t *smm = &session_main; + if (smm->session_enable_asap) { + session_enable_disable_args_t args = { .is_en = 1, + .rt_engine_type = + smm->rt_engine_type }; + vlib_worker_thread_barrier_sync (vm); - vnet_session_enable_disable (vm, 1 /* is_en */ ); + vnet_session_enable_disable (vm, &args); vlib_worker_thread_barrier_release (vm); } return 0; @@ -2330,8 +2370,22 @@ session_config_fn (vlib_main_t * vm, unformat_input_t * input) smm->port_allocator_min_src_port = tmp; else if (unformat (input, "max-src-port %d", &tmp)) smm->port_allocator_max_src_port = tmp; + else if (unformat (input, "enable rt-backend rule-table")) + { + smm->rt_engine_type = RT_BACKEND_ENGINE_RULE_TABLE; + smm->session_enable_asap = 1; + } + else if (unformat (input, "enable rt-backend sdl")) + { + smm->rt_engine_type = RT_BACKEND_ENGINE_SDL; + smm->session_enable_asap = 1; + } else if (unformat (input, "enable")) - smm->session_enable_asap = 1; + { + /* enable session without rt-backend */ + smm->rt_engine_type = RT_BACKEND_ENGINE_NONE; + smm->session_enable_asap = 1; + } else if (unformat (input, "use-app-socket-api")) (void) appns_sapi_enable_disable (1 /* is_enable */); else if (unformat (input, "poll-main")) |