X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Ftests%2Fvnet%2Fsession%2Ftcp_echo.c;h=1f49ab69e7745887ec45c2e25170edf60f7fd025;hb=d9818dd68c162079f3ddb5443a78d0d91d55d0fe;hp=6c99294099b8c90237e403e45c0e8637ad86e98b;hpb=52207f1b7b60cb0784d5241f0a4d40eef531c67e;p=vpp.git diff --git a/src/tests/vnet/session/tcp_echo.c b/src/tests/vnet/session/tcp_echo.c index 6c99294099b..1f49ab69e77 100644 --- a/src/tests/vnet/session/tcp_echo.c +++ b/src/tests/vnet/session/tcp_echo.c @@ -142,8 +142,7 @@ typedef struct * and all other messages are exchanged using shm IPC. */ u8 use_sock_api; - /* convenience */ - svm_fifo_segment_main_t *segment_main; + svm_fifo_segment_main_t segment_main; } echo_main_t; echo_main_t echo_main; @@ -263,7 +262,7 @@ wait_for_state_change (echo_main_t * em, connection_state_t state) 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)) @@ -284,7 +283,7 @@ application_send_attach (echo_main_t * em) 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; @@ -301,21 +300,21 @@ application_send_attach (echo_main_t * em) 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); } @@ -336,7 +335,7 @@ application_detach (echo_main_t * em) { 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; @@ -347,51 +346,26 @@ application_detach (echo_main_t * em) } 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; + svm_fifo_segment_main_t *sm = &echo_main.segment_main; 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))) + if ((rv = svm_fifo_segment_attach (sm, a))) { clib_warning ("svm_fifo_segment_attach ('%s') failed", name); return rv; } + vec_reset_length (a->new_segment_indices); return 0; } @@ -400,47 +374,57 @@ vl_api_application_attach_reply_t_handler (vl_api_application_attach_reply_t * 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 @@ -530,14 +514,15 @@ disconnect_from_vpp (echo_main_t * em) static void vl_api_map_another_segment_t_handler (vl_api_map_another_segment_t * mp) { + svm_fifo_segment_main_t *sm = &echo_main.segment_main; 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 */ - rv = svm_fifo_segment_attach (a); + rv = svm_fifo_segment_attach (sm, a); if (rv) { clib_warning ("svm_fifo_segment_attach ('%s') failed", @@ -621,7 +606,7 @@ send_test_chunk (echo_main_t * em, session_t * s) 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); @@ -629,8 +614,6 @@ send_test_chunk (echo_main_t * em, session_t * s) 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, @@ -721,7 +704,7 @@ client_send_connect (echo_main_t * em) { 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; @@ -735,7 +718,7 @@ client_send_disconnect (echo_main_t * em, session_t * s) { 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; @@ -747,7 +730,7 @@ client_disconnect (echo_main_t * em, session_t * s) { client_send_disconnect (em, s); pool_put (em->sessions, s); - memset (s, 0xfe, sizeof (*s)); + clib_memset (s, 0xfe, sizeof (*s)); return 0; } @@ -834,7 +817,7 @@ session_connected_handler (session_connected_msg_t * mp) */ 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 *); @@ -881,20 +864,16 @@ session_disconnected_handler (session_disconnected_msg_t * mp) 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; @@ -903,8 +882,7 @@ session_disconnected_handler (session_disconnected_msg_t * mp) 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 @@ -1255,7 +1233,7 @@ server_send_listen (echo_main_t * em) { 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; @@ -1282,7 +1260,7 @@ server_send_unbind (echo_main_t * em) 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; @@ -1312,7 +1290,7 @@ server_run (echo_main_t * em) 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); @@ -1407,25 +1385,19 @@ main (int argc, char **argv) { int i_am_server = 1, test_return_packets = 0; echo_main_t *em = &echo_main; + svm_fifo_segment_main_t *sm = &em->segment_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; @@ -1436,7 +1408,7 @@ main (int argc, char **argv) clib_time_init (&em->clib_time); init_error_string_table (em); - svm_fifo_segment_main_init (0x200000000ULL, 20); + svm_fifo_segment_main_init (sm, HIGH_SEGMENT_BASEVA, 20); unformat_init_command_line (a, argv); while (unformat_check_input (a) != UNFORMAT_END_OF_INPUT) @@ -1497,7 +1469,6 @@ main (int argc, char **argv) } em->i_am_master = i_am_server; - em->segment_main = &svm_fifo_segment_main; em->test_return_packets = test_return_packets; em->bytes_to_send = bytes_to_send; em->time_to_stop = 0;