return -1;
if (em->time_to_stop == 1)
return 0;
- if (!em->our_event_queue)
+ if (!em->our_event_queue || em->state < STATE_ATTACHED)
continue;
if (svm_msg_q_sub (em->our_event_queue, &msg, SVM_Q_NOWAIT, 0))
vl_api_application_tls_key_add_t *key_mp;
bmp = vl_msg_api_alloc (sizeof (*bmp));
- memset (bmp, 0, sizeof (*bmp));
+ clib_memset (bmp, 0, sizeof (*bmp));
bmp->_vl_msg_id = ntohs (VL_API_APPLICATION_ATTACH);
bmp->client_index = em->my_client_index;
vl_msg_api_send_shmem (em->vl_input_queue, (u8 *) & bmp);
cert_mp = vl_msg_api_alloc (sizeof (*cert_mp) + test_srv_crt_rsa_len);
- memset (cert_mp, 0, sizeof (*cert_mp));
+ clib_memset (cert_mp, 0, sizeof (*cert_mp));
cert_mp->_vl_msg_id = ntohs (VL_API_APPLICATION_TLS_CERT_ADD);
cert_mp->client_index = em->my_client_index;
cert_mp->context = ntohl (0xfeedface);
cert_mp->cert_len = clib_host_to_net_u16 (test_srv_crt_rsa_len);
- clib_memcpy (cert_mp->cert, test_srv_crt_rsa, test_srv_crt_rsa_len);
+ clib_memcpy_fast (cert_mp->cert, test_srv_crt_rsa, test_srv_crt_rsa_len);
vl_msg_api_send_shmem (em->vl_input_queue, (u8 *) & cert_mp);
key_mp = vl_msg_api_alloc (sizeof (*key_mp) + test_srv_key_rsa_len);
- memset (key_mp, 0, sizeof (*key_mp) + test_srv_key_rsa_len);
+ clib_memset (key_mp, 0, sizeof (*key_mp) + test_srv_key_rsa_len);
key_mp->_vl_msg_id = ntohs (VL_API_APPLICATION_TLS_KEY_ADD);
key_mp->client_index = em->my_client_index;
key_mp->context = ntohl (0xfeedface);
key_mp->key_len = clib_host_to_net_u16 (test_srv_key_rsa_len);
- clib_memcpy (key_mp->key, test_srv_key_rsa, test_srv_key_rsa_len);
+ clib_memcpy_fast (key_mp->key, test_srv_key_rsa, test_srv_key_rsa_len);
vl_msg_api_send_shmem (em->vl_input_queue, (u8 *) & key_mp);
}
{
vl_api_application_detach_t *bmp;
bmp = vl_msg_api_alloc (sizeof (*bmp));
- memset (bmp, 0, sizeof (*bmp));
+ clib_memset (bmp, 0, sizeof (*bmp));
bmp->_vl_msg_id = ntohs (VL_API_APPLICATION_DETACH);
bmp->client_index = em->my_client_index;
}
static int
-memfd_segment_attach (void)
-{
- ssvm_private_t _ssvm = { 0 }, *ssvm = &_ssvm;
- clib_error_t *error;
- int rv;
-
- if ((error = vl_socket_client_recv_fd_msg (&ssvm->fd, 5)))
- {
- clib_error_report (error);
- return -1;
- }
-
- if ((rv = ssvm_slave_init_memfd (ssvm)))
- return rv;
-
- return 0;
-}
-
-static int
-fifo_segment_attach (char *name, u32 size, ssvm_segment_type_t type)
+ssvm_segment_attach (char *name, ssvm_segment_type_t type, int fd)
{
svm_fifo_segment_create_args_t _a, *a = &_a;
- clib_error_t *error;
int rv;
- memset (a, 0, sizeof (*a));
+ clib_memset (a, 0, sizeof (*a));
a->segment_name = (char *) name;
- a->segment_size = size;
a->segment_type = type;
if (type == SSVM_SEGMENT_MEMFD)
- {
- if ((error = vl_socket_client_recv_fd_msg (&a->memfd_fd, 5)))
- {
- clib_error_report (error);
- return -1;
- }
- }
+ a->memfd_fd = fd;
if ((rv = svm_fifo_segment_attach (a)))
{
return rv;
}
+ vec_reset_length (a->new_segment_indices);
return 0;
}
mp)
{
echo_main_t *em = &echo_main;
- ssvm_segment_type_t seg_type;
+ int *fds = 0;
+ u32 n_fds = 0;
if (mp->retval)
{
clib_warning ("attach failed: %U", format_api_error,
clib_net_to_host_u32 (mp->retval));
- em->state = STATE_FAILED;
- return;
+ goto failed;
}
if (mp->segment_name_length == 0)
{
clib_warning ("segment_name_length zero");
- return;
+ goto failed;
}
- seg_type = em->use_sock_api ? SSVM_SEGMENT_MEMFD : SSVM_SEGMENT_SHM;
+ ASSERT (mp->app_event_queue_address);
+ em->our_event_queue = uword_to_pointer (mp->app_event_queue_address,
+ svm_msg_q_t *);
- /* Attach to fifo segment */
- if (fifo_segment_attach ((char *) mp->segment_name, mp->segment_size,
- seg_type))
+ if (mp->n_fds)
{
- em->state = STATE_FAILED;
- return;
- }
+ vec_validate (fds, mp->n_fds);
+ vl_socket_client_recv_fd_msg (fds, mp->n_fds, 5);
+
+ if (mp->fd_flags & SESSION_FD_F_VPP_MQ_SEGMENT)
+ if (ssvm_segment_attach (0, SSVM_SEGMENT_MEMFD, fds[n_fds++]))
+ goto failed;
- /* If we're using memfd segments, read and attach to event qs segment */
- if (seg_type == SSVM_SEGMENT_MEMFD)
+ if (mp->fd_flags & SESSION_FD_F_MEMFD_SEGMENT)
+ if (ssvm_segment_attach ((char *) mp->segment_name,
+ SSVM_SEGMENT_MEMFD, fds[n_fds++]))
+ goto failed;
+
+ if (mp->fd_flags & SESSION_FD_F_MQ_EVENTFD)
+ svm_msg_q_set_consumer_eventfd (em->our_event_queue, fds[n_fds++]);
+
+ vec_free (fds);
+ }
+ else
{
- if (memfd_segment_attach ())
- {
- clib_warning ("failed to attach to evt q segment");
- em->state = STATE_FAILED;
- return;
- }
+ if (ssvm_segment_attach ((char *) mp->segment_name, SSVM_SEGMENT_SHM,
+ -1))
+ goto failed;
}
- ASSERT (mp->app_event_queue_address);
- em->our_event_queue = uword_to_pointer (mp->app_event_queue_address,
- svm_msg_q_t *);
em->state = STATE_ATTACHED;
+ return;
+failed:
+ em->state = STATE_FAILED;
+ return;
}
static void
svm_fifo_segment_create_args_t _a, *a = &_a;
int rv;
- memset (a, 0, sizeof (*a));
+ clib_memset (a, 0, sizeof (*a));
a->segment_name = (char *) mp->segment_name;
a->segment_size = mp->segment_size;
/* Attach to the segment vpp created */
u64 test_buf_len, bytes_this_chunk, test_buf_offset;
svm_fifo_t *tx_fifo = s->server_tx_fifo;
u8 *test_data = em->connect_test_data;
- u32 enq_space, min_chunk = 16 << 10;
+ u32 enq_space = 16 << 10;
int written;
test_buf_len = vec_len (test_data);
bytes_this_chunk = clib_min (test_buf_len - test_buf_offset,
s->bytes_to_send);
enq_space = svm_fifo_max_enqueue (tx_fifo);
- if (enq_space < clib_min (bytes_this_chunk, min_chunk))
- return;
bytes_this_chunk = clib_min (bytes_this_chunk, enq_space);
written = svm_fifo_enqueue_nowait (tx_fifo, bytes_this_chunk,
{
vl_api_connect_uri_t *cmp;
cmp = vl_msg_api_alloc (sizeof (*cmp));
- memset (cmp, 0, sizeof (*cmp));
+ clib_memset (cmp, 0, sizeof (*cmp));
cmp->_vl_msg_id = ntohs (VL_API_CONNECT_URI);
cmp->client_index = em->my_client_index;
{
vl_api_disconnect_session_t *dmp;
dmp = vl_msg_api_alloc (sizeof (*dmp));
- memset (dmp, 0, sizeof (*dmp));
+ clib_memset (dmp, 0, sizeof (*dmp));
dmp->_vl_msg_id = ntohs (VL_API_DISCONNECT_SESSION);
dmp->client_index = em->my_client_index;
dmp->handle = s->vpp_session_handle;
{
client_send_disconnect (em, s);
pool_put (em->sessions, s);
- memset (s, 0xfe, sizeof (*s));
+ clib_memset (s, 0xfe, sizeof (*s));
return 0;
}
*/
pool_get (em->sessions, session);
- memset (session, 0, sizeof (*session));
+ clib_memset (session, 0, sizeof (*session));
session_index = session - em->sessions;
rx_fifo = uword_to_pointer (mp->server_rx_fifo, svm_fifo_t *);
int rv = 0;
p = hash_get (em->session_index_by_vpp_handles, mp->handle);
-
- if (p)
- {
- clib_warning ("disconnected");
- session = pool_elt_at_index (em->sessions, p[0]);
- hash_unset (em->session_index_by_vpp_handles, mp->handle);
- pool_put (em->sessions, session);
- }
- else
+ if (!p)
{
clib_warning ("couldn't find session key %llx", mp->handle);
- rv = -11;
+ return;
}
+ session = pool_elt_at_index (em->sessions, p[0]);
+ hash_unset (em->session_index_by_vpp_handles, mp->handle);
+ pool_put (em->sessions, session);
+
app_alloc_ctrl_evt_to_vpp (session->vpp_evt_q, app_evt,
SESSION_CTRL_EVT_DISCONNECTED_REPLY);
rmp = (session_disconnected_reply_msg_t *) app_evt->evt->data;
rmp->context = mp->context;
app_send_ctrl_evt_to_vpp (session->vpp_evt_q, app_evt);
- if (session)
- session_print_stats (em, session);
+ session_print_stats (em, session);
}
static void
{
vl_api_bind_uri_t *bmp;
bmp = vl_msg_api_alloc (sizeof (*bmp));
- memset (bmp, 0, sizeof (*bmp));
+ clib_memset (bmp, 0, sizeof (*bmp));
bmp->_vl_msg_id = ntohs (VL_API_BIND_URI);
bmp->client_index = em->my_client_index;
vl_api_unbind_uri_t *ump;
ump = vl_msg_api_alloc (sizeof (*ump));
- memset (ump, 0, sizeof (*ump));
+ clib_memset (ump, 0, sizeof (*ump));
ump->_vl_msg_id = ntohs (VL_API_UNBIND_URI);
ump->client_index = em->my_client_index;
for (i = 0; i < 200000; i++)
{
pool_get (em->sessions, session);
- memset (session, 0, sizeof (*session));
+ clib_memset (session, 0, sizeof (*session));
}
for (i = 0; i < 200000; i++)
pool_put_index (em->sessions, i);
echo_main_t *em = &echo_main;
unformat_input_t _argv, *a = &_argv;
u8 *chroot_prefix;
- u8 *heap, *uri = 0;
+ u8 *uri = 0;
u8 *bind_uri = (u8 *) "tcp://0.0.0.0/1234";
u8 *connect_uri = (u8 *) "tcp://6.0.1.1/1234";
u64 bytes_to_send = 64 << 10, mbytes;
char *app_name;
u32 tmp;
- mheap_t *h;
-
- clib_mem_init (0, 256 << 20);
-
- heap = clib_mem_get_per_cpu_heap ();
- h = mheap_header (heap);
- /* make the main heap thread-safe */
- h->flags |= MHEAP_FLAG_THREAD_SAFE;
+ clib_mem_init_thread_safe (0, 256 << 20);
- memset (em, 0, sizeof (*em));
+ clib_memset (em, 0, sizeof (*em));
em->session_index_by_vpp_handles = hash_create (0, sizeof (uword));
em->my_pid = getpid ();
em->configured_segment_size = 1 << 20;