ctx->client_opaque = sep->opaque;
ctx->c_flags |= TRANSPORT_CONNECTION_F_NO_LOOKUP;
if (sep->hostname)
- {
- ctx->srv_hostname = format (0, "%v", sep->hostname);
- vec_terminate_c_string (ctx->srv_hostname);
- }
+ ctx->srv_hostname = format (0, "%v", sep->hostname);
else
- {
- /* needed by quic for crypto + determining client / server */
- ctx->srv_hostname =
- format (0, "%U", format_ip46_address, &sep->ip, sep->is_ip4);
- }
+ /* needed by quic for crypto + determining client / server */
+ ctx->srv_hostname =
+ format (0, "%U", format_ip46_address, &sep->ip, sep->is_ip4);
+ vec_terminate_c_string (ctx->srv_hostname);
clib_memcpy (&cargs->sep, sep, sizeof (session_endpoint_cfg_t));
cargs->sep.transport_proto = TRANSPORT_PROTO_UDPC;
/* If the app opens a stream in its callback it may invalidate ctx */
ctx = quic_ctx_get (ctx_id, thread_index);
+ /*
+ * app_worker_connect_notify() might have reallocated pool, reload
+ * quic_session pointer
+ */
+ quic_session = session_get (ctx->c_s_index, thread_index);
quic_session->session_state = SESSION_STATE_LISTENING;
return 0;
{
/* Right ctx found, create conn & remove from pool */
quic_create_connection(*ctx_index_ptr, sa, salen, packet_ctx->packet);
- pool_put (opening_ctx_pool, ctx_index_ptr);
*max_packet = packet_n + 1;
packet_ctx->thread_index = thread_index;
packet_ctx->ctx_index = *ctx_index_ptr;
+ pool_put (opening_ctx_pool, ctx_index_ptr);
goto updateOffset;
}
}));
transport_register_protocol (TRANSPORT_PROTO_QUIC, &quic_proto,
FIB_PROTOCOL_IP6, ~0);
- quic_register_cipher_suite (CRYPTO_ENGINE_VPP, vpp_crypto_cipher_suites);
+ quic_register_cipher_suite (CRYPTO_ENGINE_VPP, quic_crypto_cipher_suites);
quic_register_cipher_suite (CRYPTO_ENGINE_PICOTLS,
ptls_openssl_cipher_suites);
qm->default_cipher = CRYPTO_ENGINE_PICOTLS;
return 0;
}
+static u8 *
+quic_format_ctx_stat (u8 * s, va_list * args)
+{
+ quic_ctx_t *ctx = va_arg (*args, quic_ctx_t *);
+ quicly_stats_t quicly_stats;
+
+ quicly_get_stats (ctx->conn, &quicly_stats);
+
+ s = format (s, "\n\rQUIC conn stats \n\r");
+
+ s =
+ format (s, "RTT: min:%d, smoothed:%d, variance:%d, latest:%d \n\r",
+ quicly_stats.rtt.minimum, quicly_stats.rtt.smoothed,
+ quicly_stats.rtt.variance, quicly_stats.rtt.latest);
+ s = format (s, "Packet loss:%d \n\r", quicly_stats.num_packets.lost);
+
+ return s;
+}
+
+static clib_error_t *
+quic_plugin_showstats_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ quic_main_t *qm = &quic_main;
+ quic_ctx_t *ctx = NULL;
+ u32 num_workers = vlib_num_workers ();
+
+ for (int i = 0; i < num_workers + 1; i++)
+ {
+ /* *INDENT-OFF* */
+ pool_foreach (ctx, qm->ctx_pool[i],
+ ({
+ if(!(ctx->flags & QUIC_F_IS_LISTENER) && !(ctx->flags & QUIC_F_IS_STREAM))
+ vlib_cli_output (vm, "%U", quic_format_ctx_stat, ctx);
+ }));
+ /* *INDENT-ON* */
+ }
+ return 0;
+}
+
/* *INDENT-OFF* */
VLIB_CLI_COMMAND(quic_plugin_crypto_command, static)=
{
.short_help = "quic set crypto api [picotls, vpp]",
.function = quic_plugin_crypto_command_fn,
};
+VLIB_CLI_COMMAND(quic_plugin_stats_command, static)=
+{
+ .path = "show quic stats",
+ .short_help = "show quic stats",
+ .function = quic_plugin_showstats_command_fn,
+};
VLIB_PLUGIN_REGISTER () =
{
.version = VPP_BUILD_VER,