memif: use clib_socket_t for socket connections
This reverts commit 590acf8fa7af6a8604edd72a32f9f087be52c767. new version includes minor fix for the crash when the interface is deleted. Change-Id: I8fc56eb9145e4d8e1d410206f84e705045898608 Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:

committed by
Damjan Marion

parent
4e50d2f1f8
commit
b966b8e63f
@ -309,8 +309,9 @@ memif_show_command_fn (vlib_main_t * vm, unformat_input_t * input,
|
||||
vlib_cli_output (vm, " id %d mode %U file %s", mif->id,
|
||||
format_memif_if_mode, mif, msf->filename);
|
||||
vlib_cli_output (vm, " flags%U", format_memif_if_flags, mif->flags);
|
||||
vlib_cli_output (vm, " listener-fd %d conn-fd %d", msf->fd,
|
||||
mif->conn_fd);
|
||||
vlib_cli_output (vm, " listener-fd %d conn-fd %d",
|
||||
msf->sock ? msf->sock->fd : 0,
|
||||
mif->sock ? mif->sock->fd : 0);
|
||||
vlib_cli_output (vm,
|
||||
" num-s2m-rings %u num-m2s-rings %u buffer-size %u",
|
||||
mif->run.num_s2m_rings, mif->run.num_m2s_rings,
|
||||
|
@ -83,7 +83,7 @@ memif_disconnect (memif_if_t * mif, clib_error_t * err)
|
||||
{
|
||||
clib_error_t *e = 0;
|
||||
mif->local_disc_string = vec_dup (err->what);
|
||||
if (mif->conn_fd > -1)
|
||||
if (mif->sock && clib_socket_is_connected (mif->sock))
|
||||
e = memif_msg_send_disconnect (mif, err);
|
||||
clib_error_free (e);
|
||||
}
|
||||
@ -94,17 +94,21 @@ memif_disconnect (memif_if_t * mif, clib_error_t * err)
|
||||
vnet_hw_interface_set_flags (vnm, mif->hw_if_index, 0);
|
||||
|
||||
/* close connection socket */
|
||||
if (mif->conn_clib_file_index != ~0)
|
||||
if (mif->sock && mif->sock->fd)
|
||||
{
|
||||
memif_socket_file_t *msf = vec_elt_at_index (mm->socket_files,
|
||||
mif->socket_file_index);
|
||||
hash_unset (msf->dev_instance_by_fd, mif->conn_fd);
|
||||
memif_file_del_by_index (mif->conn_clib_file_index);
|
||||
mif->conn_clib_file_index = ~0;
|
||||
hash_unset (msf->dev_instance_by_fd, mif->sock->fd);
|
||||
memif_socket_close (&mif->sock);
|
||||
}
|
||||
else if (mif->sock)
|
||||
{
|
||||
clib_error_t *err;
|
||||
err = clib_socket_close (mif->sock);
|
||||
if (err)
|
||||
clib_error_report (err);
|
||||
clib_mem_free (mif->sock);
|
||||
}
|
||||
else if (mif->conn_fd > -1)
|
||||
close (mif->conn_fd);
|
||||
mif->conn_fd = -1;
|
||||
|
||||
vec_foreach_index (i, mif->rx_queues)
|
||||
{
|
||||
@ -137,8 +141,6 @@ memif_disconnect (memif_if_t * mif, clib_error_t * err)
|
||||
close (mr->fd);
|
||||
}
|
||||
vec_free (mif->regions);
|
||||
|
||||
mif->remote_pid = 0;
|
||||
vec_free (mif->remote_name);
|
||||
vec_free (mif->remote_if_name);
|
||||
clib_fifo_free (mif->msg_queue);
|
||||
@ -362,19 +364,14 @@ memif_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
|
||||
{
|
||||
memif_main_t *mm = &memif_main;
|
||||
memif_if_t *mif;
|
||||
struct sockaddr_un sun;
|
||||
int sockfd;
|
||||
clib_socket_t *sock;
|
||||
uword *event_data = 0, event_type;
|
||||
u8 enabled = 0;
|
||||
f64 start_time, last_run_duration = 0, now;
|
||||
clib_error_t *err;
|
||||
|
||||
sockfd = socket (AF_UNIX, SOCK_SEQPACKET, 0);
|
||||
if (sockfd < 0)
|
||||
{
|
||||
DBG_UNIX_LOG ("socket AF_UNIX");
|
||||
return 0;
|
||||
}
|
||||
sun.sun_family = AF_UNIX;
|
||||
sock = clib_mem_alloc (sizeof (clib_socket_t));
|
||||
memset (sock, 0, sizeof (clib_socket_t));
|
||||
|
||||
while (1)
|
||||
{
|
||||
@ -425,33 +422,29 @@ memif_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
|
||||
|
||||
if (mif->flags & MEMIF_IF_FLAG_IS_SLAVE)
|
||||
{
|
||||
strncpy (sun.sun_path, (char *) msf->filename,
|
||||
sizeof (sun.sun_path) - 1);
|
||||
memset (sock, 0, sizeof(clib_socket_t));
|
||||
sock->config = (char *) msf->filename;
|
||||
sock->flags = CLIB_SOCKET_F_IS_CLIENT| CLIB_SOCKET_F_SEQPACKET;
|
||||
|
||||
if (connect
|
||||
(sockfd, (struct sockaddr *) &sun,
|
||||
sizeof (struct sockaddr_un)) == 0)
|
||||
if ((err = clib_socket_init (sock)))
|
||||
{
|
||||
clib_error_free (err);
|
||||
}
|
||||
else
|
||||
{
|
||||
clib_file_t t = { 0 };
|
||||
|
||||
mif->conn_fd = sockfd;
|
||||
t.read_function = memif_slave_conn_fd_read_ready;
|
||||
t.write_function = memif_slave_conn_fd_write_ready;
|
||||
t.error_function = memif_slave_conn_fd_error;
|
||||
t.file_descriptor = mif->conn_fd;
|
||||
t.file_descriptor = sock->fd;
|
||||
t.private_data = mif->dev_instance;
|
||||
memif_file_add (&mif->conn_clib_file_index, &t);
|
||||
hash_set (msf->dev_instance_by_fd, mif->conn_fd, mif->dev_instance);
|
||||
memif_file_add (&sock->private_data, &t);
|
||||
hash_set (msf->dev_instance_by_fd, sock->fd, mif->dev_instance);
|
||||
|
||||
mif->flags |= MEMIF_IF_FLAG_CONNECTING;
|
||||
|
||||
/* grab another fd */
|
||||
sockfd = socket (AF_UNIX, SOCK_SEQPACKET, 0);
|
||||
if (sockfd < 0)
|
||||
{
|
||||
DBG_UNIX_LOG ("socket AF_UNIX");
|
||||
return 0;
|
||||
}
|
||||
mif->sock = sock;
|
||||
sock = clib_mem_alloc (sizeof(clib_socket_t));
|
||||
}
|
||||
}
|
||||
}));
|
||||
@ -506,18 +499,25 @@ memif_delete_if (vlib_main_t * vm, memif_if_t * mif)
|
||||
{
|
||||
if (msf->is_listener)
|
||||
{
|
||||
uword *x;
|
||||
memif_file_del_by_index (msf->clib_file_index);
|
||||
vec_foreach (x, msf->pending_file_indices)
|
||||
int i;
|
||||
vec_foreach_index (i, msf->pending_clients)
|
||||
{
|
||||
memif_file_del_by_index (*x);
|
||||
memif_socket_close (msf->pending_clients + i);
|
||||
}
|
||||
vec_free (msf->pending_file_indices);
|
||||
memif_socket_close (&msf->sock);
|
||||
vec_free (msf->pending_clients);
|
||||
}
|
||||
mhash_free (&msf->dev_instance_by_id);
|
||||
hash_free (msf->dev_instance_by_fd);
|
||||
mhash_unset (&mm->socket_file_index_by_filename, msf->filename, 0);
|
||||
vec_free (msf->filename);
|
||||
if (msf->sock)
|
||||
{
|
||||
err = clib_socket_close (msf->sock);
|
||||
if (err)
|
||||
clib_error_report (err);
|
||||
clib_mem_free (msf->sock);
|
||||
}
|
||||
pool_put (mm->socket_files, msf);
|
||||
}
|
||||
|
||||
@ -625,7 +625,6 @@ memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args)
|
||||
sizeof (memif_interface_id_t));
|
||||
msf->dev_instance_by_fd = hash_create (0, sizeof (uword));
|
||||
msf->filename = socket_filename;
|
||||
msf->fd = -1;
|
||||
msf->is_listener = (args->is_master != 0);
|
||||
socket_filename = 0;
|
||||
mhash_set (&mm->socket_file_index_by_filename, msf->filename,
|
||||
@ -639,8 +638,6 @@ memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args)
|
||||
mif->socket_file_index = msf - mm->socket_files;
|
||||
mif->id = args->id;
|
||||
mif->sw_if_index = mif->hw_if_index = mif->per_interface_next_index = ~0;
|
||||
mif->conn_clib_file_index = ~0;
|
||||
mif->conn_fd = -1;
|
||||
mif->mode = args->mode;
|
||||
if (args->secret)
|
||||
mif->secret = vec_dup (args->secret);
|
||||
@ -701,48 +698,36 @@ memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args)
|
||||
/* If this is new one, start listening */
|
||||
if (msf->is_listener && msf->ref_cnt == 0)
|
||||
{
|
||||
struct sockaddr_un un = { 0 };
|
||||
struct stat file_stat;
|
||||
int on = 1;
|
||||
clib_socket_t *s = clib_mem_alloc (sizeof (clib_socket_t));
|
||||
|
||||
if ((msf->fd = socket (AF_UNIX, SOCK_SEQPACKET, 0)) < 0)
|
||||
ASSERT (msf->sock == 0);
|
||||
msf->sock = s;
|
||||
|
||||
memset (s, 0, sizeof (clib_socket_t));
|
||||
s->config = (char *) msf->filename;
|
||||
s->flags = CLIB_SOCKET_F_IS_SERVER |
|
||||
CLIB_SOCKET_F_ALLOW_GROUP_WRITE |
|
||||
CLIB_SOCKET_F_SEQPACKET | CLIB_SOCKET_F_PASSCRED;
|
||||
|
||||
if ((error = clib_socket_init (s)))
|
||||
{
|
||||
clib_error_report (error);
|
||||
ret = VNET_API_ERROR_SYSCALL_ERROR_4;
|
||||
goto error;
|
||||
}
|
||||
|
||||
un.sun_family = AF_UNIX;
|
||||
strncpy ((char *) un.sun_path, (char *) msf->filename,
|
||||
sizeof (un.sun_path) - 1);
|
||||
|
||||
if (setsockopt (msf->fd, SOL_SOCKET, SO_PASSCRED, &on, sizeof (on)) < 0)
|
||||
{
|
||||
ret = VNET_API_ERROR_SYSCALL_ERROR_5;
|
||||
goto error;
|
||||
}
|
||||
if (bind (msf->fd, (struct sockaddr *) &un, sizeof (un)) == -1)
|
||||
{
|
||||
ret = VNET_API_ERROR_SYSCALL_ERROR_6;
|
||||
goto error;
|
||||
}
|
||||
if (listen (msf->fd, 1) == -1)
|
||||
{
|
||||
ret = VNET_API_ERROR_SYSCALL_ERROR_7;
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (stat ((char *) msf->filename, &file_stat) == -1)
|
||||
{
|
||||
ret = VNET_API_ERROR_SYSCALL_ERROR_8;
|
||||
goto error;
|
||||
}
|
||||
|
||||
msf->clib_file_index = ~0;
|
||||
clib_file_t template = { 0 };
|
||||
template.read_function = memif_conn_fd_accept_ready;
|
||||
template.file_descriptor = msf->fd;
|
||||
template.file_descriptor = msf->sock->fd;
|
||||
template.private_data = mif->socket_file_index;
|
||||
memif_file_add (&msf->clib_file_index, &template);
|
||||
memif_file_add (&msf->sock->private_data, &template);
|
||||
}
|
||||
|
||||
msf->ref_cnt++;
|
||||
|
@ -40,7 +40,6 @@
|
||||
|
||||
#if MEMIF_DEBUG == 1
|
||||
#define memif_file_add(a, b) do { \
|
||||
ASSERT (*a == ~0); \
|
||||
*a = clib_file_add (&file_main, b); \
|
||||
clib_warning ("clib_file_add fd %d private_data %u idx %u", \
|
||||
(b)->file_descriptor, (b)->private_data, *a); \
|
||||
@ -57,7 +56,6 @@
|
||||
} while (0)
|
||||
#else
|
||||
#define memif_file_add(a, b) do { \
|
||||
ASSERT (*a == ~0); \
|
||||
*a = clib_file_add (&file_main, b); \
|
||||
} while (0)
|
||||
#define memif_file_del(a) clib_file_del(&file_main, a)
|
||||
@ -67,9 +65,8 @@
|
||||
typedef struct
|
||||
{
|
||||
u8 *filename;
|
||||
int fd;
|
||||
uword clib_file_index;
|
||||
uword *pending_file_indices;
|
||||
clib_socket_t *sock;
|
||||
clib_socket_t **pending_clients;
|
||||
int ref_cnt;
|
||||
int is_listener;
|
||||
|
||||
@ -138,9 +135,8 @@ typedef struct
|
||||
u32 per_interface_next_index;
|
||||
|
||||
/* socket connection */
|
||||
clib_socket_t *sock;
|
||||
uword socket_file_index;
|
||||
int conn_fd;
|
||||
uword conn_clib_file_index;
|
||||
memif_msg_fifo_elt_t *msg_queue;
|
||||
u8 *secret;
|
||||
|
||||
@ -150,9 +146,6 @@ typedef struct
|
||||
memif_queue_t *tx_queues;
|
||||
|
||||
/* remote info */
|
||||
pid_t remote_pid;
|
||||
uid_t remote_uid;
|
||||
gid_t remote_gid;
|
||||
u8 *remote_name;
|
||||
u8 *remote_if_name;
|
||||
|
||||
@ -241,6 +234,7 @@ clib_error_t *memif_connect (memif_if_t * mif);
|
||||
void memif_disconnect (memif_if_t * mif, clib_error_t * err);
|
||||
|
||||
/* socket.c */
|
||||
void memif_socket_close (clib_socket_t ** sock);
|
||||
clib_error_t *memif_conn_fd_accept_ready (clib_file_t * uf);
|
||||
clib_error_t *memif_master_conn_fd_read_ready (clib_file_t * uf);
|
||||
clib_error_t *memif_slave_conn_fd_read_ready (clib_file_t * uf);
|
||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user