Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
mss_clamp: TCP MSS clamping plugin
[vpp.git]
/
src
/
vlibmemory
/
socket_api.c
diff --git
a/src/vlibmemory/socket_api.c
b/src/vlibmemory/socket_api.c
index
eb0466d
..
d85339b
100644
(file)
--- a/
src/vlibmemory/socket_api.c
+++ b/
src/vlibmemory/socket_api.c
@@
-85,13
+85,13
@@
vl_sock_api_dump_clients (vlib_main_t * vm, api_main_t * am)
vlib_cli_output (vm, "Socket clients");
vlib_cli_output (vm, "%20s %8s", "Name", "Fildesc");
/* *INDENT-OFF* */
vlib_cli_output (vm, "Socket clients");
vlib_cli_output (vm, "%20s %8s", "Name", "Fildesc");
/* *INDENT-OFF* */
- pool_foreach (reg, sm->registration_pool
,
-
(
{
+ pool_foreach (reg, sm->registration_pool
)
+
{
if (reg->registration_type == REGISTRATION_TYPE_SOCKET_SERVER) {
f = vl_api_registration_file (reg);
vlib_cli_output (vm, "%20s %8d", reg->name, f->file_descriptor);
}
if (reg->registration_type == REGISTRATION_TYPE_SOCKET_SERVER) {
f = vl_api_registration_file (reg);
vlib_cli_output (vm, "%20s %8d", reg->name, f->file_descriptor);
}
- }
));
+ }
/* *INDENT-ON* */
}
/* *INDENT-ON* */
}
@@
-148,6
+148,15
@@
vl_socket_api_send (vl_api_registration_t * rp, u8 * elem)
error = clib_file_write (cf);
unix_save_error (&unix_main, error);
error = clib_file_write (cf);
unix_save_error (&unix_main, error);
+ /* Make sure cf not removed in clib_file_write */
+ cf = vl_api_registration_file (rp);
+ if (!cf)
+ {
+ clib_warning ("cf removed");
+ vl_msg_api_free ((void *) elem);
+ return;
+ }
+
/* If we didn't finish sending everything, wait for tx space */
if (vec_len (sock_rp->output_vector) > 0
&& !(cf->flags & UNIX_FILE_DATA_AVAILABLE_TO_WRITE))
/* If we didn't finish sending everything, wait for tx space */
if (vec_len (sock_rp->output_vector) > 0
&& !(cf->flags & UNIX_FILE_DATA_AVAILABLE_TO_WRITE))
@@
-170,6
+179,8
@@
vl_socket_free_registration_index (u32 pool_index)
{
int i;
vl_api_registration_t *rp;
{
int i;
vl_api_registration_t *rp;
+ void vl_api_call_reaper_functions (u32 client_index);
+
if (pool_is_free_index (socket_main.registration_pool, pool_index))
{
clib_warning ("main pool index %d already free", pool_index);
if (pool_is_free_index (socket_main.registration_pool, pool_index))
{
clib_warning ("main pool index %d already free", pool_index);
@@
-177,6
+188,8
@@
vl_socket_free_registration_index (u32 pool_index)
}
rp = pool_elt_at_index (socket_main.registration_pool, pool_index);
}
rp = pool_elt_at_index (socket_main.registration_pool, pool_index);
+ vl_api_call_reaper_functions (pool_index);
+
ASSERT (rp->registration_type != REGISTRATION_TYPE_FREE);
for (i = 0; i < vec_len (rp->additional_fds_to_close); i++)
if (close (rp->additional_fds_to_close[i]) < 0)
ASSERT (rp->registration_type != REGISTRATION_TYPE_FREE);
for (i = 0; i < vec_len (rp->additional_fds_to_close); i++)
if (close (rp->additional_fds_to_close[i]) < 0)
@@
-406,6
+419,7
@@
socksvr_file_add (clib_file_main_t * fm, int fd)
template.write_function = vl_socket_write_ready;
template.error_function = vl_socket_error_ready;
template.file_descriptor = fd;
template.write_function = vl_socket_write_ready;
template.error_function = vl_socket_error_ready;
template.file_descriptor = fd;
+ template.description = format (0, "socksrv");
template.private_data = rp - socket_main.registration_pool;
rp->registration_type = REGISTRATION_TYPE_SOCKET_SERVER;
template.private_data = rp - socket_main.registration_pool;
rp->registration_type = REGISTRATION_TYPE_SOCKET_SERVER;
@@
-469,8
+483,10
@@
vl_api_sockclnt_create_t_handler (vl_api_sockclnt_create_t * mp)
hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
({
rp->message_table[i].index = htons(hp->value[0]);
hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
({
rp->message_table[i].index = htons(hp->value[0]);
- 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. */);
+ (void) 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* */
i++;
}));
/* *INDENT-ON* */
@@
-535,7
+551,8
@@
vl_sock_api_send_fd_msg (int socket_fd, int fds[], int n_fds)
cmsg->cmsg_type = SCM_RIGHTS;
clib_memcpy_fast (CMSG_DATA (cmsg), fds, sizeof (int) * n_fds);
cmsg->cmsg_type = SCM_RIGHTS;
clib_memcpy_fast (CMSG_DATA (cmsg), fds, sizeof (int) * n_fds);
- rv = sendmsg (socket_fd, &mh, 0);
+ while ((rv = sendmsg (socket_fd, &mh, 0)) < 0 && errno == EAGAIN)
+ ;
if (rv < 0)
return clib_error_return_unix (0, "sendmsg");
return 0;
if (rv < 0)
return clib_error_return_unix (0, "sendmsg");
return 0;
@@
-621,8
+638,8
@@
vl_api_sock_init_shm_t_handler (vl_api_sock_init_shm_t * mp)
}
if (regp->registration_type != REGISTRATION_TYPE_SOCKET_SERVER)
{
}
if (regp->registration_type != REGISTRATION_TYPE_SOCKET_SERVER)
{
- rv = -31; /* VNET_API_ERROR_INVALID_REGISTRATION */
-
goto reply
;
+ clib_warning ("Invalid registration");
+
return
;
}
/*
}
/*
@@
-632,12
+649,17
@@
vl_api_sock_init_shm_t_handler (vl_api_sock_init_shm_t * mp)
clib_memset (memfd, 0, sizeof (*memfd));
memfd->ssvm_size = mp->requested_size;
memfd->requested_va = 0ULL;
clib_memset (memfd, 0, sizeof (*memfd));
memfd->ssvm_size = mp->requested_size;
memfd->requested_va = 0ULL;
- memfd->i
_am_mast
er = 1;
+ memfd->i
s_serv
er = 1;
memfd->name = format (0, "%s%c", regp->name, 0);
memfd->name = format (0, "%s%c", regp->name, 0);
- if ((rv = ssvm_
mast
er_init_memfd (memfd)))
+ if ((rv = ssvm_
serv
er_init_memfd (memfd)))
goto reply;
goto reply;
+ /* delete the unused heap created in ssvm_server_init_memfd and mark it
+ * accessible again for ASAN */
+ clib_mem_destroy_heap (memfd->sh->heap);
+ CLIB_MEM_UNPOISON ((void *) memfd->sh->ssvm_va, memfd->ssvm_size);
+
/* Remember to close this fd when the socket connection goes away */
vec_add1 (regp->additional_fds_to_close, memfd->fd);
/* Remember to close this fd when the socket connection goes away */
vec_add1 (regp->additional_fds_to_close, memfd->fd);
@@
-691,6
+713,11
@@
reply:
/* Send the magic "here's your sign (aka fd)" socket message */
cf = vl_api_registration_file (regp);
/* Send the magic "here's your sign (aka fd)" socket message */
cf = vl_api_registration_file (regp);
+ if (!cf)
+ {
+ clib_warning ("cf removed");
+ return;
+ }
/* Wait for reply to be consumed before sending the fd */
while (tries-- > 0)
/* Wait for reply to be consumed before sending the fd */
while (tries-- > 0)
@@
-755,6
+782,7
@@
vl_sock_api_init (vlib_main_t * vm)
template.read_function = socksvr_accept_ready;
template.write_function = socksvr_bogus_write;
template.file_descriptor = sock->fd;
template.read_function = socksvr_accept_ready;
template.write_function = socksvr_bogus_write;
template.file_descriptor = sock->fd;
+ template.description = format (0, "socksvr %s", sock->config);
template.private_data = rp - sm->registration_pool;
rp->clib_file_index = clib_file_add (fm, &template);
template.private_data = rp - sm->registration_pool;
rp->clib_file_index = clib_file_add (fm, &template);
@@
-772,11
+800,11
@@
socket_exit (vlib_main_t * vm)
{
u32 index;
/* *INDENT-OFF* */
{
u32 index;
/* *INDENT-OFF* */
- pool_foreach (rp, sm->registration_pool
, (
{
+ pool_foreach (rp, sm->registration_pool
)
{
vl_api_registration_del_file (rp);
index = rp->vl_api_registration_pool_index;
vl_socket_free_registration_index (index);
vl_api_registration_del_file (rp);
index = rp->vl_api_registration_pool_index;
vl_socket_free_registration_index (index);
- }
));
+ }
/* *INDENT-ON* */
}
/* *INDENT-ON* */
}