X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fplugins%2Fhs_apps%2Fvcl%2Fvcl_test_server.c;h=b7731d365d0ce7993e9fea71f86ea1a1d8ae995f;hb=4cae8f9bee5f295f88090cd9a035f18b4899aa1d;hp=78d7752dd68c2f95257411e7d1668a9348ab49f6;hpb=fe286f7d17a41ee2c2bee8b93fe1dd1a3b6ba10e;p=vpp.git diff --git a/src/plugins/hs_apps/vcl/vcl_test_server.c b/src/plugins/hs_apps/vcl/vcl_test_server.c index 78d7752dd68..b7731d365d0 100644 --- a/src/plugins/hs_apps/vcl/vcl_test_server.c +++ b/src/plugins/hs_apps/vcl/vcl_test_server.c @@ -306,6 +306,48 @@ vts_server_echo (vcl_test_session_t *conn, int rx_bytes) vtinf ("(fd %d): TX (%d bytes) - '%s'", conn->fd, tx_bytes, conn->rxbuf); } +static vcl_test_session_t * +vts_accept_ctrl (vcl_test_server_worker_t *wrk, int listen_fd) +{ + vcl_test_server_main_t *vsm = &vcl_server_main; + const vcl_test_proto_vft_t *tp; + vcl_test_session_t *conn; + struct epoll_event ev; + int rv; + + conn = conn_pool_alloc (wrk); + if (!conn) + { + vtwrn ("No free connections!"); + return 0; + } + + if (vsm->ctrl) + conn->cfg = vsm->ctrl->cfg; + vcl_test_session_buf_alloc (conn); + clock_gettime (CLOCK_REALTIME, &conn->old_stats.stop); + + tp = vcl_test_main.protos[VPPCOM_PROTO_TCP]; + if (tp->accept (listen_fd, conn)) + return 0; + + vtinf ("CTRL accepted fd = %d (0x%08x) on listener fd = %d (0x%08x)", + conn->fd, conn->fd, listen_fd, listen_fd); + + ev.events = EPOLLET | EPOLLIN; + ev.data.u64 = conn - wrk->conn_pool; + rv = vppcom_epoll_ctl (wrk->epfd, EPOLL_CTL_ADD, conn->fd, &ev); + if (rv < 0) + { + vterr ("vppcom_epoll_ctl()", rv); + return 0; + } + + wrk->nfds++; + + return conn; +} + static vcl_test_session_t * vts_accept_client (vcl_test_server_worker_t *wrk, int listen_fd) { @@ -331,8 +373,9 @@ vts_accept_client (vcl_test_server_worker_t *wrk, int listen_fd) if (tp->accept (listen_fd, conn)) return 0; - vtinf ("Got a connection -- fd = %d (0x%08x) on listener fd = %d (0x%08x)", - conn->fd, conn->fd, listen_fd, listen_fd); + if (conn->cfg.num_test_sessions < VCL_TEST_CFG_MAX_SELECT_SESS) + vtinf ("Got a connection -- fd = %d (0x%08x) on listener fd = %d (0x%08x)", + conn->fd, conn->fd, listen_fd, listen_fd); ev.events = EPOLLET | EPOLLIN; ev.data.u64 = conn - wrk->conn_pool; @@ -460,18 +503,20 @@ vcl_test_server_process_opts (vcl_test_server_main_t * vsm, int argc, print_usage_and_exit (); } - if (argc < (optind + 1)) + if (argc > (optind + 1)) { - fprintf (stderr, "SERVER: ERROR: Insufficient number of arguments!\n"); + fprintf (stderr, "Incorrect number of arguments!\n"); print_usage_and_exit (); } - - if (sscanf (argv[optind], "%d", &v) == 1) - vsm->server_cfg.port = (uint16_t) v; - else + else if (argc > 1 && argc == (optind + 1)) { - fprintf (stderr, "SERVER: ERROR: Invalid port (%s)!\n", argv[optind]); - print_usage_and_exit (); + if (sscanf (argv[optind], "%d", &v) == 1) + vsm->server_cfg.port = (uint16_t) v; + else + { + fprintf (stderr, "Invalid port (%s)!\n", argv[optind]); + print_usage_and_exit (); + } } vcl_test_init_endpoint_addr (vsm); @@ -520,6 +565,7 @@ vts_handle_ctrl_cfg (vcl_test_server_worker_t *wrk, vcl_test_cfg_t *rx_cfg, wrk->nfds--; if (wrk->nfds) vts_wrk_cleanup_all (wrk); + vcl_server_main.ctrl = 0; break; default: @@ -544,7 +590,7 @@ vts_worker_init (vcl_test_server_worker_t * wrk) vtinf ("Initializing worker ..."); - conn_pool_expand (wrk, VCL_TEST_CFG_MAX_TEST_SESS + 1); + conn_pool_expand (wrk, VCL_TEST_CFG_INIT_TEST_SESS + 1); if (wrk->wrk_index) if (vppcom_worker_register ()) vtfail ("vppcom_worker_register()", 1); @@ -633,13 +679,13 @@ vts_worker_loop (void *arg) */ if (ep_evts[i].events & (EPOLLHUP | EPOLLRDHUP)) { - vts_session_cleanup (conn); - wrk->nfds--; - if (!wrk->nfds) + if (conn == vsm->ctrl) { - vtinf ("All client connections closed\n"); - goto done; + vtinf ("ctrl session went away"); + vsm->ctrl = 0; } + vts_session_cleanup (conn); + wrk->nfds--; continue; } @@ -654,9 +700,13 @@ vts_worker_loop (void *arg) vtwrn ("ctrl already exists"); continue; } - vsm->ctrl = vts_accept_client (wrk, vsm->ctrl_listen_fd); + vsm->ctrl = vts_accept_ctrl (wrk, vsm->ctrl_listen_fd); continue; } + + /* at this point ctrl session must be valid */ + ASSERT (vsm->ctrl); + if (ep_evts[i].data.u32 == VCL_TEST_DATA_LISTENER) { conn = vts_accept_client (wrk, wrk->listener.fd); @@ -812,6 +862,8 @@ main (int argc, char **argv) vsm->workers[i].wrk_index = i; rv = pthread_create (&vsm->workers[i].thread_handle, NULL, vts_worker_loop, (void *) &vsm->workers[i]); + if (rv) + vtfail ("pthread_create()", rv); } vts_worker_loop (&vsm->workers[0]);