if (wrk->mqs_epfd > 0)
close (wrk->mqs_epfd);
+ pool_free (wrk->sessions);
+ pool_free (wrk->mq_evt_conns);
hash_free (wrk->session_index_by_vpp_handles);
vec_free (wrk->mq_events);
vec_free (wrk->mq_msg_vector);
+ vec_free (wrk->unhandled_evts_vector);
+ vec_free (wrk->pending_session_wrk_updates);
+ clib_bitmap_free (wrk->rd_bitmap);
+ clib_bitmap_free (wrk->wr_bitmap);
+ clib_bitmap_free (wrk->ex_bitmap);
vcl_worker_free (wrk);
clib_spinlock_unlock (&vcm->workers_lock);
}
}
}
+ wrk->ep_lt_current = VCL_INVALID_SESSION_INDEX;
wrk->session_index_by_vpp_handles = hash_create (0, sizeof (uword));
clib_time_init (&wrk->clib_time);
vec_validate (wrk->mq_events, 64);
else
return VPPCOM_EBADFD;
}
+ else if (s->session_state == VCL_STATE_UPDATED)
+ {
+ return 0;
+ }
else
{
return (s->session_state == VCL_STATE_DISCONNECT) ?
int
vcl_session_alloc_ext_cfg (vcl_session_t *s,
- transport_endpt_ext_cfg_type_t type)
+ transport_endpt_ext_cfg_type_t type, u32 len)
{
if (s->ext_config)
return -1;
- s->ext_config = clib_mem_alloc (sizeof (transport_endpt_ext_cfg_t));
- clib_memset (s->ext_config, 0, sizeof (*s->ext_config));
- s->ext_config->len = sizeof (*s->ext_config);
+ s->ext_config = clib_mem_alloc (len);
+ clib_memset (s->ext_config, 0, len);
+ s->ext_config->len = len;
s->ext_config->type = type;
return 0;
return c;
}
+int
+vcl_session_share_fifos (vcl_session_t *s, svm_fifo_t *rxf, svm_fifo_t *txf)
+{
+ vcl_worker_t *wrk = vcl_worker_get_current ();
+ fifo_segment_t *fs;
+
+ clib_rwlock_reader_lock (&vcm->segment_table_lock);
+
+ fs = fifo_segment_get_segment (&vcm->segment_main, rxf->segment_index);
+ s->rx_fifo = fifo_segment_duplicate_fifo (fs, rxf);
+ s->tx_fifo = fifo_segment_duplicate_fifo (fs, txf);
+
+ clib_rwlock_reader_unlock (&vcm->segment_table_lock);
+
+ svm_fifo_add_subscriber (s->rx_fifo, wrk->vpp_wrk_index);
+ svm_fifo_add_subscriber (s->tx_fifo, wrk->vpp_wrk_index);
+
+ return 0;
+}
+
/*
* fd.io coding-style-patch-verification: ON
*