pool_get_aligned (session_manager_main.sessions[thread_index], s,
CLIB_CACHE_LINE_BYTES);
}
- memset (s, 0, sizeof (*s));
+ clib_memset (s, 0, sizeof (*s));
s->session_index = s - session_manager_main.sessions[thread_index];
s->thread_index = thread_index;
return s;
{
pool_put (session_manager_main.sessions[s->thread_index], s);
if (CLIB_DEBUG)
- memset (s, 0xFA, sizeof (*s));
+ clib_memset (s, 0xFA, sizeof (*s));
}
-static void
+void
session_free_w_fifos (stream_session_t * s)
{
segment_manager_dealloc_fifos (s->svm_segment_index, s->server_rx_fifo,
s = session_alloc (thread_index);
s->session_type = session_type_from_proto_and_ip (tc->proto, tc->is_ip4);
s->session_state = SESSION_STATE_CONNECTING;
- s->enqueue_epoch = ~0;
+ s->enqueue_epoch = (u64) ~ 0;
/* Attach transport to session and vice versa */
s->connection_index = tc->c_index;
* by calling stream_server_flush_enqueue_events () */
session_manager_main_t *smm = vnet_get_session_manager_main ();
u32 thread_index = s->thread_index;
- u32 enqueue_epoch = smm->current_enqueue_epoch[tc->proto][thread_index];
+ u64 enqueue_epoch = smm->current_enqueue_epoch[tc->proto][thread_index];
if (s->enqueue_epoch != enqueue_epoch)
{
* by calling stream_server_flush_enqueue_events () */
session_manager_main_t *smm = vnet_get_session_manager_main ();
u32 thread_index = s->thread_index;
- u32 enqueue_epoch = smm->current_enqueue_epoch[proto][thread_index];
+ u64 enqueue_epoch = smm->current_enqueue_epoch[proto][thread_index];
if (s->enqueue_epoch != enqueue_epoch)
{
* from the app, do the whole disconnect since we might still
* have lingering events */
stream_session_disconnect (s);
+ s->session_state = SESSION_STATE_CLOSED;
break;
case SESSION_STATE_CLOSING:
/* Cleanup lookup table. Transport needs to still be valid */
session_lookup_del_session (s);
+ s->session_state = SESSION_STATE_CLOSED;
break;
case SESSION_STATE_CLOSED:
+ case SESSION_STATE_ACCEPTING:
stream_session_delete (s);
break;
+ default:
+ /* Assume connection was not yet added the lookup table */
+ session_free_w_fifos (s);
+ break;
}
-
- s->session_state = SESSION_STATE_CLOSED;
}
/**
session_open_cl (u32 app_wrk_index, session_endpoint_t * rmt, u32 opaque)
{
transport_connection_t *tc;
- transport_endpoint_t *tep;
+ transport_endpoint_cfg_t *tep;
segment_manager_t *sm;
app_worker_t *app_wrk;
stream_session_t *s;
application_t *app;
int rv;
- tep = session_endpoint_to_transport (rmt);
+ tep = session_endpoint_to_transport_cfg (rmt);
rv = tp_vfts[rmt->transport_proto].open (tep);
if (rv < 0)
{
session_open_vc (u32 app_wrk_index, session_endpoint_t * rmt, u32 opaque)
{
transport_connection_t *tc;
- transport_endpoint_t *tep;
+ transport_endpoint_cfg_t *tep;
u64 handle;
int rv;
- tep = session_endpoint_to_transport (rmt);
+ tep = session_endpoint_to_transport_cfg (rmt);
rv = tp_vfts[rmt->transport_proto].open (tep);
if (rv < 0)
{
int
session_open_app (u32 app_wrk_index, session_endpoint_t * rmt, u32 opaque)
{
- session_endpoint_extended_t *sep = (session_endpoint_extended_t *) rmt;
+ session_endpoint_cfg_t *sep = (session_endpoint_cfg_t *) rmt;
+ transport_endpoint_cfg_t *tep_cfg = session_endpoint_to_transport_cfg (sep);
+
sep->app_wrk_index = app_wrk_index;
sep->opaque = opaque;
- return tp_vfts[rmt->transport_proto].open ((transport_endpoint_t *) sep);
+ return tp_vfts[rmt->transport_proto].open (tep_cfg);
}
typedef int (*session_open_service_fn) (u32, session_endpoint_t *, u32);
* @param sep Local endpoint to be listened on.
*/
int
-session_listen (stream_session_t * ls, session_endpoint_extended_t * sep)
+session_listen (stream_session_t * ls, session_endpoint_cfg_t * sep)
{
transport_connection_t *tc;
transport_endpoint_t *tep;
if (vlib_thread_is_main_w_barrier () || thread_index == s->thread_index)
{
vec_add2 (smm->pending_disconnects[s->thread_index], evt, 1);
- memset (evt, 0, sizeof (*evt));
+ clib_memset (evt, 0, sizeof (*evt));
evt->session_handle = session_handle (s);
evt->event_type = FIFO_EVENT_DISCONNECT;
}
vec_validate (smm->free_event_vector, num_threads - 1);
vec_validate (smm->vpp_event_queues, num_threads - 1);
vec_validate (smm->peekers_rw_locks, num_threads - 1);
+ vec_validate (smm->dispatch_period, num_threads - 1);
+ vec_validate (smm->last_vlib_time, num_threads - 1);
vec_validate_aligned (smm->ctx, num_threads - 1, CLIB_CACHE_LINE_BYTES);
for (i = 0; i < TRANSPORT_N_PROTO; i++)
_vec_len (smm->pending_event_vector[i]) = 0;
vec_validate (smm->pending_disconnects[i], 0);
_vec_len (smm->pending_disconnects[i]) = 0;
+
+ smm->last_vlib_time[i] = vlib_time_now (vlib_mains[i]);
+
if (num_threads > 1)
clib_rwlock_init (&smm->peekers_rw_locks[i]);
}
/* Enable transports */
transport_enable_disable (vm, 1);
-
+ transport_init_tx_pacers_period ();
return 0;
}