svm_msg_q_unlock (mq);
return -2;
}
- msg = svm_msg_q_alloc_msg_w_ring (mq, SESSION_MQ_IO_EVT_RING);
- if (PREDICT_FALSE (svm_msg_q_msg_is_invalid (&msg)))
- {
- svm_msg_q_unlock (mq);
- return -2;
- }
- evt = (session_event_t *) svm_msg_q_msg_data (mq, &msg);
- evt->event_type = evt_type;
switch (evt_type)
{
case SESSION_CTRL_EVT_RPC:
+ msg = svm_msg_q_alloc_msg_w_ring (mq, SESSION_MQ_IO_EVT_RING);
+ evt = (session_event_t *) svm_msg_q_msg_data (mq, &msg);
evt->rpc_args.fp = data;
evt->rpc_args.arg = args;
break;
case SESSION_IO_EVT_TX:
case SESSION_IO_EVT_TX_FLUSH:
case SESSION_IO_EVT_BUILTIN_RX:
+ msg = svm_msg_q_alloc_msg_w_ring (mq, SESSION_MQ_IO_EVT_RING);
+ evt = (session_event_t *) svm_msg_q_msg_data (mq, &msg);
evt->session_index = *(u32 *) data;
break;
case SESSION_IO_EVT_BUILTIN_TX:
case SESSION_CTRL_EVT_CLOSE:
case SESSION_CTRL_EVT_RESET:
+ msg = svm_msg_q_alloc_msg_w_ring (mq, SESSION_MQ_IO_EVT_RING);
+ evt = (session_event_t *) svm_msg_q_msg_data (mq, &msg);
evt->session_handle = session_handle ((session_t *) data);
break;
default:
svm_msg_q_unlock (mq);
return -1;
}
+ evt->event_type = evt_type;
svm_msg_q_add_and_unlock (mq, &msg);
return 0;
s = session_get (tc->s_index, tc->thread_index);
ASSERT (s->thread_index == vlib_get_thread_index ());
- ASSERT (s->session_state < SESSION_STATE_TRANSPORT_DELETED);
+ ASSERT (s->session_state != SESSION_STATE_TRANSPORT_DELETED);
if (!(s->flags & SESSION_F_CUSTOM_TX))
{
s->flags |= SESSION_F_CUSTOM_TX;
new_s->rx_fifo->master_session_index = new_s->session_index;
new_s->rx_fifo->master_thread_index = new_s->thread_index;
new_s->session_state = SESSION_STATE_READY;
+ new_s->flags |= SESSION_F_IS_MIGRATING;
session_lookup_add_connection (tc, session_handle (new_s));
/*
/* Session was created but accept notification was not yet sent to the
* app. Cleanup everything. */
session_lookup_del_session (s);
- session_free_w_fifos (s);
+ segment_manager_dealloc_fifos (s->rx_fifo, s->tx_fifo);
+ session_free (s);
break;
case SESSION_STATE_ACCEPTING:
case SESSION_STATE_TRANSPORT_CLOSING:
* session is just removed because both transport and app have
* confirmed the close*/
session_lookup_del_session (s);
- s->session_state = SESSION_STATE_CLOSED;
+ s->session_state = SESSION_STATE_TRANSPORT_DELETED;
session_cleanup_notify (s, SESSION_CLEANUP_TRANSPORT);
svm_fifo_dequeue_drop_all (s->tx_fifo);
session_program_transport_ctrl_evt (s, SESSION_CTRL_EVT_CLOSE);
void
session_transport_cleanup (session_t * s)
{
- s->session_state = SESSION_STATE_CLOSED;
-
/* Delete from main lookup table before we axe the the transport */
session_lookup_del_session (s);
- transport_cleanup (session_get_transport_proto (s), s->connection_index,
- s->thread_index);
+ if (s->session_state != SESSION_STATE_TRANSPORT_DELETED)
+ transport_cleanup (session_get_transport_proto (s), s->connection_index,
+ s->thread_index);
/* Since we called cleanup, no delete notification will come. So, make
* sure the session is properly freed. */
session_free_w_fifos (s);
wrk->old_head = clib_llist_make_head (wrk->event_elts, evt_list);
wrk->vm = vlib_mains[i];
wrk->last_vlib_time = vlib_time_now (vlib_mains[i]);
+ wrk->last_vlib_us_time = wrk->last_vlib_time * CLIB_US_TIME_FREQ;
if (num_threads > 1)
clib_rwlock_init (&smm->wrk[i].peekers_rw_locks);
/* Enable transports */
transport_enable_disable (vm, 1);
- transport_init_tx_pacers_period ();
return 0;
}
smm->evt_qs_segment_size = 1 << 20;
#endif
smm->is_enabled = 0;
+ smm->session_enable_asap = 0;
+ return 0;
+}
+
+static clib_error_t *
+session_main_init (vlib_main_t * vm)
+{
+ session_main_t *smm = &session_main;
+ if (smm->session_enable_asap)
+ {
+ vlib_worker_thread_barrier_sync (vm);
+ vnet_session_enable_disable (vm, 1 /* is_en */ );
+ vlib_worker_thread_barrier_release (vm);
+ }
return 0;
}
VLIB_INIT_FUNCTION (session_manager_main_init);
+VLIB_MAIN_LOOP_ENTER_FUNCTION (session_main_init);
static clib_error_t *
session_config_fn (vlib_main_t * vm, unformat_input_t * input)
&smm->evt_qs_segment_size))
;
else if (unformat (input, "enable"))
- vnet_session_enable_disable (vm, 1 /* is_en */ );
+ smm->session_enable_asap = 1;
else
return clib_error_return (0, "unknown input `%U'",
format_unformat_error, input);