{
ASSERT (vec_len (rp->unprocessed_input) == 0);
vec_validate (rp->unprocessed_input, vec_len (msg_buffer) - 1);
- clib_memcpy (rp->unprocessed_input, msg_buffer,
- vec_len (msg_buffer));
+ clib_memcpy_fast (rp->unprocessed_input, msg_buffer,
+ vec_len (msg_buffer));
_vec_len (rp->unprocessed_input) = vec_len (msg_buffer);
}
_vec_len (socket_main.input_buffer) = save_input_buffer_length;
regp->name = format (0, "%s%c", mp->name, 0);
u32 size = sizeof (*rp) + (nmsg * sizeof (vl_api_message_table_entry_t));
- rp = vl_msg_api_alloc (size);
+ rp = vl_msg_api_alloc_zero (size);
rp->_vl_msg_id = htons (VL_API_SOCKCLNT_CREATE_REPLY);
rp->index = htonl (sock_api_registration_handle (regp));
rp->context = mp->context;
hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
({
rp->message_table[i].index = htons(hp->value[0]);
- strncpy((char *)rp->message_table[i].name, (char *)hp->key, 64-1);
+ strncpy_s((char *)rp->message_table[i].name, 64 /* bytes of space at dst */,
+ (char *)hp->key, 64-1 /* chars to copy, without zero byte. */);
i++;
}));
/* *INDENT-ON* */
if (!regp)
return;
- u32 reg_index = ntohl (mp->index);
+ u32 reg_index = socket_api_registration_handle_to_index (ntohl (mp->index));
rp = vl_msg_api_alloc (sizeof (*rp));
rp->_vl_msg_id = htons (VL_API_SOCKCLNT_DELETE_REPLY);
rp->context = mp->context;
cmsg->cmsg_len = CMSG_LEN (sizeof (int) * n_fds);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
- clib_memcpy (CMSG_DATA (cmsg), fds, sizeof (int) * n_fds);
+ clib_memcpy_fast (CMSG_DATA (cmsg), fds, sizeof (int) * n_fds);
rv = sendmsg (socket_fd, &mh, 0);
if (rv < 0)
clib_file_t *cf;
vl_api_shm_elem_config_t *config = 0;
vl_shmem_hdr_t *shmem_hdr;
- int rv;
+ int rv, tries = 1000;
regp = vl_api_client_index_to_registration (mp->client_index);
if (regp == 0)
/* Send the magic "here's your sign (aka fd)" socket message */
cf = vl_api_registration_file (regp);
+
+ /* Wait for reply to be consumed before sending the fd */
+ while (tries-- > 0)
+ {
+ int bytes;
+ rv = ioctl (cf->file_descriptor, TIOCOUTQ, &bytes);
+ if (rv < 0)
+ {
+ clib_unix_warning ("ioctl returned");
+ break;
+ }
+ if (bytes == 0)
+ break;
+ usleep (1e3);
+ }
+
vl_sock_api_send_fd_msg (cf->file_descriptor, &memfd->fd, 1);
}
#define foreach_vlib_api_msg \
-_(SOCKCLNT_CREATE, sockclnt_create) \
-_(SOCKCLNT_DELETE, sockclnt_delete) \
-_(SOCK_INIT_SHM, sock_init_shm)
+ _(SOCKCLNT_CREATE, sockclnt_create, 1) \
+ _(SOCKCLNT_DELETE, sockclnt_delete, 1) \
+ _(SOCK_INIT_SHM, sock_init_shm, 1)
clib_error_t *
vl_sock_api_init (vlib_main_t * vm)
if (sm->socket_name == 0)
return 0;
-#define _(N,n) \
+#define _(N,n,t) \
vl_msg_api_set_handlers(VL_API_##N, #n, \
vl_api_##n##_t_handler, \
vl_noop_handler, \
vl_api_##n##_t_endian, \
vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
+ sizeof(vl_api_##n##_t), t);
foreach_vlib_api_msg;
#undef _
vec_resize (sm->input_buffer, 4096);
sock->config = (char *) sm->socket_name;
-
- /* mkdir of file socket, only under /run */
- if (strncmp (sock->config, "/run", 4) == 0)
- {
- u8 *tmp = format (0, "%s", sock->config);
- int i = vec_len (tmp);
- while (i && tmp[--i] != '/')
- ;
-
- tmp[i] = 0;
-
- if (i)
- vlib_unix_recursive_mkdir ((char *) tmp);
- vec_free (tmp);
- }
-
- sock->flags = CLIB_SOCKET_F_IS_SERVER | CLIB_SOCKET_F_SEQPACKET |
- CLIB_SOCKET_F_ALLOW_GROUP_WRITE;
+ sock->flags = CLIB_SOCKET_F_IS_SERVER | CLIB_SOCKET_F_ALLOW_GROUP_WRITE;
error = clib_socket_init (sock);
if (error)
return error;
{
if (unformat (input, "socket-name %s", &sm->socket_name))
;
+ /* DEPRECATE: default keyword is ignored */
else if (unformat (input, "default"))
- {
- sm->socket_name = format (0, "%s%c", API_SOCKET_FILE, 0);
- }
+ ;
else
{
return clib_error_return (0, "unknown input '%U'",
format_unformat_error, input);
}
}
+
+ if (!vec_len (sm->socket_name))
+ sm->socket_name = format (0, "%s/%s", vlib_unix_get_runtime_dir (),
+ API_SOCKET_FILENAME);
+ vec_terminate_c_string (sm->socket_name);
+
return 0;
}
VLIB_CONFIG_FUNCTION (socksvr_config, "socksvr");
-clib_error_t *
-vlibsocket_init (vlib_main_t * vm)
+void
+vlibsocket_reference ()
{
- return 0;
}
-VLIB_INIT_FUNCTION (vlibsocket_init);
-
/*
* fd.io coding-style-patch-verification: ON
*