X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fhs_apps%2Fsapi%2Fvpp_echo_proto_quic.c;h=bd7903bb771632cbe0433d4c2196afdc95e015f3;hb=7c40a3837a7a256cbb61dfad15be6e910058e4ba;hp=28c89a65fbfc448e95491c6ab7eb79564931a1bb;hpb=ecd1fc7dfa6a36d1774f71093380b3548a22346b;p=vpp.git diff --git a/src/plugins/hs_apps/sapi/vpp_echo_proto_quic.c b/src/plugins/hs_apps/sapi/vpp_echo_proto_quic.c index 28c89a65fbf..bd7903bb771 100644 --- a/src/plugins/hs_apps/sapi/vpp_echo_proto_quic.c +++ b/src/plugins/hs_apps/sapi/vpp_echo_proto_quic.c @@ -54,15 +54,14 @@ quic_echo_on_connected_connect (session_connected_msg_t * mp, { echo_main_t *em = &echo_main; quic_echo_proto_main_t *eqm = &quic_echo_proto_main; - u8 *uri = format (0, "QUIC://session/%lu", mp->handle); u64 i; echo_notify_event (em, ECHO_EVT_FIRST_SCONNECT); for (i = 0; i < eqm->n_stream_clients; i++) - echo_send_rpc (em, echo_send_connect, (void *) uri, session_index); + echo_send_rpc (em, echo_send_connect, (void *) mp->handle, session_index); - ECHO_LOG (0, "Qsession 0x%llx connected to %U:%d", - mp->handle, format_ip46_address, &mp->lcl.ip, + ECHO_LOG (0, "Qsession 0x%llx S[%d] connected to %U:%d", + mp->handle, session_index, format_ip46_address, &mp->lcl.ip, mp->lcl.is_ip4, clib_net_to_host_u16 (mp->lcl.port)); } @@ -83,7 +82,8 @@ quic_echo_on_connected_send (session_connected_msg_t * mp, u32 session_index) static void quic_echo_on_connected_error (session_connected_msg_t * mp, u32 session_index) { - ECHO_FAIL ("Got a wrong connected on session %u [%lx]", session_index, + ECHO_FAIL (ECHO_FAIL_QUIC_WRONG_CONNECT, + "Got a wrong connected on session %u [%lx]", session_index, mp->handle); } @@ -106,20 +106,20 @@ quic_echo_on_accept_connect (session_accepted_msg_t * mp, u32 session_index) { echo_main_t *em = &echo_main; quic_echo_proto_main_t *eqm = &quic_echo_proto_main; - ECHO_LOG (1, "Accept on QSession 0x%lx %u", mp->handle); - u8 *uri = format (0, "QUIC://session/%lu", mp->handle); + ECHO_LOG (1, "Accept on QSession 0x%lx S[%u]", mp->handle, session_index); u32 i; echo_notify_event (em, ECHO_EVT_FIRST_SCONNECT); for (i = 0; i < eqm->n_stream_clients; i++) - echo_send_rpc (em, echo_send_connect, (void *) uri, session_index); + echo_send_rpc (em, echo_send_connect, (void *) mp->handle, session_index); } static void quic_echo_on_accept_error (session_accepted_msg_t * mp, u32 session_index) { - ECHO_FAIL ("Got a wrong accept on session %u [%lx]", session_index, - mp->handle); + ECHO_FAIL (ECHO_FAIL_QUIC_WRONG_ACCEPT, + "Got a wrong accept on session 0x%lx S[%u]", mp->handle, + session_index); } static void @@ -164,7 +164,12 @@ quic_echo_cleanup_listener (u32 listener_index, echo_main_t * em, { echo_session_t *ls; ls = pool_elt_at_index (em->sessions, listener_index); - ASSERT (ls->session_type == ECHO_SESSION_TYPE_QUIC); + if (ls->session_type != ECHO_SESSION_TYPE_QUIC) + { + ECHO_LOG (1, "%U: Invalid listener session type", + echo_format_session, ls); + return; + } if (!clib_atomic_sub_fetch (&ls->accepted_session_count, 1)) { if (eqm->send_quic_disconnects == ECHO_CLOSE_F_ACTIVE) @@ -186,7 +191,12 @@ quic_echo_cleanup_cb (echo_session_t * s, u8 parent_died) { echo_main_t *em = &echo_main; quic_echo_proto_main_t *eqm = &quic_echo_proto_main; - ASSERT (s->session_state < ECHO_SESSION_STATE_CLOSED); + if ((em->state == STATE_DATA_DONE) || + !(s->session_state < ECHO_SESSION_STATE_CLOSED)) + return; + ECHO_LOG (2, "%U cleanup (parent_died %d)", echo_format_session, s, + parent_died); + s->session_state = ECHO_SESSION_STATE_CLOSED; if (s->session_type == ECHO_SESSION_TYPE_QUIC) { if (parent_died) @@ -202,12 +212,11 @@ quic_echo_cleanup_cb (echo_session_t * s, u8 parent_died) quic_echo_cleanup_listener (s->listener_index, em, eqm); clib_atomic_sub_fetch (&em->n_clients_connected, 1); } - - ECHO_LOG (1, "Cleanup sessions (still %uQ %uS)", - eqm->n_quic_clients_connected, em->n_clients_connected); - s->session_state = ECHO_SESSION_STATE_CLOSED; if (!em->n_clients_connected && !eqm->n_quic_clients_connected) em->state = STATE_DATA_DONE; + ECHO_LOG (1, "Cleanup sessions (still %uQ %uS): app %U", + eqm->n_quic_clients_connected, em->n_clients_connected, + echo_format_app_state, em->state); } static void @@ -225,18 +234,19 @@ quic_echo_initiate_qsession_close_no_stream (echo_main_t * em) { if (eqm->send_quic_disconnects == ECHO_CLOSE_F_ACTIVE) { - ECHO_LOG (1,"ACTIVE close 0x%lx", s->vpp_session_handle); - echo_send_rpc (em, echo_send_disconnect_session, (void *) s->vpp_session_handle, 0); + ECHO_LOG (1,"%U: ACTIVE close", echo_format_session, s); + echo_send_rpc (em, echo_send_disconnect_session, + (void *) s->vpp_session_handle, 0); clib_atomic_fetch_add (&em->stats.active_count.q, 1); } else if (eqm->send_quic_disconnects == ECHO_CLOSE_F_NONE) { - ECHO_LOG (1,"Discard close 0x%lx", s->vpp_session_handle); + ECHO_LOG (1,"%U: CLEAN close", echo_format_session, s); quic_echo_cleanup_cb (s, 0 /* parent_died */); clib_atomic_fetch_add (&em->stats.clean_count.q, 1); } else - ECHO_LOG (1,"Passive close 0x%lx", s->vpp_session_handle); + ECHO_LOG (1,"%U: PASSIVE close", echo_format_session, s); } })); /* *INDENT-ON* */ @@ -249,10 +259,11 @@ quic_echo_on_connected (session_connected_msg_t * mp, u32 session_index) quic_echo_proto_main_t *eqm = &quic_echo_proto_main; echo_session_t *listen_session; echo_session_t *session = pool_elt_at_index (em->sessions, session_index); + if (session->listener_index == SESSION_INVALID_INDEX) { - ECHO_LOG (1, "Connected session 0x%lx -> URI", mp->handle); session->session_type = ECHO_SESSION_TYPE_QUIC; + ECHO_LOG (1, "Connected %U -> URI", echo_format_session, session); session->accepted_session_count = 0; if (eqm->cb_vft.quic_connected_cb) eqm->cb_vft.quic_connected_cb (mp, session->session_index); @@ -262,10 +273,10 @@ quic_echo_on_connected (session_connected_msg_t * mp, u32 session_index) { listen_session = pool_elt_at_index (em->sessions, session->listener_index); - ECHO_LOG (1, "Connected session 0x%lx -> 0x%lx", mp->handle, - listen_session->vpp_session_handle); session->session_type = ECHO_SESSION_TYPE_STREAM; clib_atomic_fetch_add (&listen_session->accepted_session_count, 1); + ECHO_LOG (1, "Connected %U -> %U", echo_format_session, session, + echo_format_session, listen_session); if (em->i_am_master && eqm->cb_vft.server_stream_connected_cb) eqm->cb_vft.server_stream_connected_cb (mp, session->session_index); if (!em->i_am_master && eqm->cb_vft.client_stream_connected_cb) @@ -293,19 +304,18 @@ quic_echo_retry_connect (u32 session_index) /* retry connect */ echo_session_t *session; echo_main_t *em = &echo_main; - u8 *uri; if (session_index == SESSION_INVALID_INDEX) { - ECHO_LOG (1, "Retrying connect %s", em->uri); - echo_send_rpc (em, echo_send_connect, (void *) em->uri, + ECHO_LOG (1, "Retrying Qsession connect"); + echo_send_rpc (em, echo_send_connect, (void *) SESSION_INVALID_HANDLE, SESSION_INVALID_INDEX); } else { session = pool_elt_at_index (em->sessions, session_index); - uri = format (0, "QUIC://session/%lu", session->vpp_session_handle); - ECHO_LOG (1, "Retrying connect %s", uri); - echo_send_rpc (em, echo_send_connect, (void *) uri, session_index); + ECHO_LOG (1, "Retrying connect %U", echo_format_session, session); + echo_send_rpc (em, echo_send_connect, + (void *) session->vpp_session_handle, session_index); } } @@ -362,7 +372,7 @@ quic_echo_accepted_cb (session_accepted_msg_t * mp, echo_session_t * session) } static void -quic_echo_disconnected_reply_cb (echo_session_t * s) +quic_echo_sent_disconnect_cb (echo_session_t * s) { if (s->session_type == ECHO_SESSION_TYPE_STREAM) s->session_state = ECHO_SESSION_STATE_CLOSING; @@ -423,9 +433,8 @@ quic_echo_unformat_setup_vft (unformat_input_t * input, va_list * args) static int quic_echo_process_opts_cb (unformat_input_t * a) { - echo_main_t *em = &echo_main; quic_echo_proto_main_t *eqm = &quic_echo_proto_main; - if (unformat (a, "nclients %d/%d", &em->n_clients, &eqm->n_stream_clients)) + if (unformat (a, "quic-streams %d", &eqm->n_stream_clients)) ; else if (unformat (a, "quic-setup %U", quic_echo_unformat_setup_vft)) ; @@ -454,9 +463,7 @@ quic_echo_set_defaults_after_opts_cb () em->n_connects = em->n_clients; em->n_sessions = - clib_max (1, - eqm->n_stream_clients) * em->n_clients + eqm->n_stream_clients + - 1; + clib_max (1, eqm->n_stream_clients) * em->n_clients + em->n_clients + 1; em->n_clients = eqm->n_stream_clients * em->n_clients; if (em->i_am_master) @@ -478,9 +485,9 @@ quic_echo_print_usage_cb () " On each one server opens M streams\n" " OPT=default : Client open N connections.\n" " On each one client opens M streams\n" - " qclose=[Y|N|W] When a connection is done pass[N] send[Y] or wait[W] for close\n" + " qclose=[Y|N|W] When connection is done send[Y]|nop[N]|wait[W] for close\n" "\n" - " nclients N[/M] Open N QUIC connections, each one with M streams (M defaults to 1)\n"); + " quic-streams N Open N QUIC streams (defaults to 1)\n"); } echo_proto_cb_vft_t quic_echo_proto_cb_vft = { @@ -488,7 +495,7 @@ echo_proto_cb_vft_t quic_echo_proto_cb_vft = { .connected_cb = quic_echo_connected_cb, .accepted_cb = quic_echo_accepted_cb, .reset_cb = quic_echo_reset_cb, - .disconnected_reply_cb = quic_echo_disconnected_reply_cb, + .sent_disconnect_cb = quic_echo_sent_disconnect_cb, .cleanup_cb = quic_echo_cleanup_cb, .process_opts_cb = quic_echo_process_opts_cb, .print_usage_cb = quic_echo_print_usage_cb,