X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fmemif%2Fmemif.c;h=98d31eb045353720ed76208c5cf187d853d0858f;hb=11b8dbf78af49d270a0e72abe7dea73eec30d85f;hp=7ba67c5b89817b53f30edb6fb2952f9a3492f88e;hpb=eaabe073515e7722ed546b36f99efc6feea305a1;p=vpp.git diff --git a/src/plugins/memif/memif.c b/src/plugins/memif/memif.c index 7ba67c5b898..98d31eb0453 100644 --- a/src/plugins/memif/memif.c +++ b/src/plugins/memif/memif.c @@ -85,7 +85,7 @@ memif_connect (vlib_main_t * vm, memif_if_t * mif) VNET_HW_INTERFACE_FLAG_LINK_UP); } -static void +void memif_disconnect (vlib_main_t * vm, memif_if_t * mif) { vnet_main_t *vnm = vnet_get_main (); @@ -241,6 +241,7 @@ memif_process_connect_req (memif_pending_conn_t * pending_conn, uf->private_data = mif->if_index << 1; mif->connection = pending_conn->connection; pool_put (mm->pending_conns, pending_conn); + pending_conn = 0; memif_connect (vm, mif); @@ -248,7 +249,22 @@ response: resp.version = MEMIF_VERSION; resp.type = MEMIF_MSG_TYPE_CONNECT_RESP; resp.retval = retval; - send (fd, &resp, sizeof (resp), 0); + if (send (fd, &resp, sizeof (resp), 0) < 0) + { + DEBUG_UNIX_LOG ("Failed to send connection response"); + error = clib_error_return_unix (0, "send fd %d", fd); + if (pending_conn) + memif_remove_pending_conn (pending_conn); + else + memif_disconnect (vm, mif); + } + if (retval > 0) + { + if (shm_fd >= 0) + close (shm_fd); + if (int_fd >= 0) + close (int_fd); + } return error; } @@ -352,7 +368,7 @@ memif_conn_fd_read_ready (unix_file_t * uf) else if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) { - clib_memcpy (fd_array, CMSG_DATA (cmsg), sizeof (fd_array)); + memcpy (fd_array, CMSG_DATA (cmsg), sizeof (fd_array)); } cmsg = CMSG_NXTHDR (&mh, cmsg); } @@ -511,7 +527,8 @@ memif_connect_master (vlib_main_t * vm, memif_if_t * mif) { u16 slot = i * (1 << mif->log2_ring_size) + j; ring->desc[j].region = 0; - ring->desc[j].offset = buffer_offset + (slot * mif->buffer_size); + ring->desc[j].offset = + buffer_offset + (u32) (slot * mif->buffer_size); ring->desc[j].buffer_length = mif->buffer_size; } } @@ -524,7 +541,8 @@ memif_connect_master (vlib_main_t * vm, memif_if_t * mif) u16 slot = (i + mif->num_s2m_rings) * (1 << mif->log2_ring_size) + j; ring->desc[j].region = 0; - ring->desc[j].offset = buffer_offset + (slot * mif->buffer_size); + ring->desc[j].offset = + buffer_offset + (u32) (slot * mif->buffer_size); ring->desc[j].buffer_length = mif->buffer_size; } } @@ -555,7 +573,7 @@ memif_connect_master (vlib_main_t * vm, memif_if_t * mif) cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; fd_array[0] = mfd; - clib_memcpy (CMSG_DATA (cmsg), fd_array, sizeof (fd_array)); + memcpy (CMSG_DATA (cmsg), fd_array, sizeof (fd_array)); mif->flags |= MEMIF_IF_FLAG_CONNECTING; rv = sendmsg (mif->connection.fd, &mh, 0); @@ -595,6 +613,11 @@ memif_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) f64 start_time, last_run_duration = 0, now; sockfd = socket (AF_UNIX, SOCK_STREAM, 0); + if (sockfd < 0) + { + DEBUG_UNIX_LOG ("socket AF_UNIX"); + return 0; + } sun.sun_family = AF_UNIX; template.read_function = memif_conn_fd_read_ready; @@ -716,11 +739,7 @@ memif_close_if (memif_main_t * mm, memif_if_t * mif) } } - if (mif->lockp != 0) - { - clib_mem_free ((void *) mif->lockp); - mif->lockp = 0; - } + clib_spinlock_free (&mif->lockp); mhash_unset (&mm->if_index_by_key, &mif->key, &mif->if_index); vec_free (mif->socket_filename); @@ -734,26 +753,28 @@ int memif_worker_thread_enable () { /* if worker threads are enabled, switch to polling mode */ + /* *INDENT-OFF* */ foreach_vlib_main (( { vlib_node_set_state (this_vlib_main, memif_input_node.index, VLIB_NODE_STATE_POLLING); })); - + /* *INDENT-ON* */ return 0; } int memif_worker_thread_disable () { + /* *INDENT-OFF* */ foreach_vlib_main (( { vlib_node_set_state (this_vlib_main, memif_input_node.index, VLIB_NODE_STATE_INTERRUPT); })); - + /* *INDENT-ON* */ return 0; } @@ -783,11 +804,7 @@ memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args) mif->connection.fd = mif->interrupt_line.fd = -1; if (tm->n_vlib_mains > 1) - { - mif->lockp = clib_mem_alloc_aligned (CLIB_CACHE_LINE_BYTES, - CLIB_CACHE_LINE_BYTES); - memset ((void *) mif->lockp, 0, CLIB_CACHE_LINE_BYTES); - } + clib_spinlock_init (&mif->lockp); if (!args->hw_addr_set) {