}
/* Transport proto functions */
-static int
-quic_connect_stream (session_t * quic_session, session_endpoint_cfg_t * sep)
-{
- quic_main_t *qm = &quic_main;
- uint64_t quic_session_handle;
- session_t *stream_session;
- quic_stream_data_t *stream_data;
- void *stream;
- void *conn;
- app_worker_t *app_wrk;
- quic_ctx_t *qctx, *sctx;
- u32 sctx_index;
- u8 is_unidir;
- int rv;
-
- /* Find base session to which the user want to attach a stream */
- quic_session_handle = session_handle (quic_session);
- QUIC_DBG (2, "Connect stream: session 0x%lx", quic_session_handle);
-
- if (session_type_transport_proto (quic_session->session_type) !=
- TRANSPORT_PROTO_QUIC)
- {
- QUIC_ERR ("received incompatible session");
- return -1;
- }
-
- app_wrk = app_worker_get_if_valid (quic_session->app_wrk_index);
- if (!app_wrk)
- {
- QUIC_ERR ("Invalid app worker :(");
- return -1;
- }
-
- sctx_index = quic_ctx_alloc (
- qm, quic_session->thread_index); /* Allocate before we get pointers */
- sctx = quic_ctx_get (sctx_index, quic_session->thread_index);
- qctx =
- quic_ctx_get (quic_session->connection_index, quic_session->thread_index);
- if (quic_ctx_is_stream (qctx))
- {
- QUIC_ERR ("session is a stream");
- quic_ctx_free (qm, sctx);
- return -1;
- }
-
- sctx->parent_app_wrk_id = qctx->parent_app_wrk_id;
- sctx->parent_app_id = qctx->parent_app_id;
- sctx->quic_connection_ctx_id = qctx->c_c_index;
- sctx->c_c_index = sctx_index;
- sctx->c_flags |= TRANSPORT_CONNECTION_F_NO_LOOKUP;
- sctx->flags |= QUIC_F_IS_STREAM;
-
- if (!(conn = qctx->conn))
- return -1;
-
- is_unidir = sep->transport_flags & TRANSPORT_CFG_F_UNIDIRECTIONAL;
- rv = quic_eng_connect_stream (conn, &stream, &stream_data, is_unidir);
- if (rv)
- {
- QUIC_DBG (1,
- "Connect stream: failed %d, conn %p, stream %p, stream_data "
- "%p, unidir %d",
- rv, conn, &stream, &stream_data, is_unidir);
- return -1;
- }
- quic_increment_counter (qm, QUIC_ERROR_OPENED_STREAM, 1);
-
- sctx->stream = stream;
- sctx->crypto_context_index = qctx->crypto_context_index;
-
- stream_session = session_alloc (qctx->c_thread_index);
- QUIC_DBG (
- 2, "Connect stream: stream_session handle 0x%lx, sctx_index %u, thread %u",
- session_handle (stream_session), sctx_index, qctx->c_thread_index);
- stream_session->app_wrk_index = app_wrk->wrk_index;
- stream_session->connection_index = sctx_index;
- stream_session->listener_handle = quic_session_handle;
- stream_session->session_type =
- session_type_from_proto_and_ip (TRANSPORT_PROTO_QUIC, qctx->udp_is_ip4);
- if (is_unidir)
- stream_session->flags |= SESSION_F_UNIDIRECTIONAL;
-
- sctx->c_s_index = stream_session->session_index;
- stream_data->ctx_id = sctx->c_c_index;
- stream_data->thread_index = sctx->c_thread_index;
- stream_data->app_rx_data_len = 0;
- stream_data->app_tx_data_len = 0;
- stream_session->session_state = SESSION_STATE_READY;
- stream_session->opaque = sep->opaque;
-
- /* For now we only reset streams. Cleanup will be triggered by timers */
- if ((rv = app_worker_init_connected (app_wrk, stream_session)))
- {
- QUIC_ERR ("Connect stream: failed app_worker_init_connected %d", rv);
- quic_eng_connect_stream_error_reset (stream);
- return app_worker_connect_notify (app_wrk, NULL, rv, sep->opaque);
- }
-
- svm_fifo_init_ooo_lookup (stream_session->rx_fifo, 0 /* ooo enq */);
- svm_fifo_init_ooo_lookup (stream_session->tx_fifo, 1 /* ooo deq */);
- svm_fifo_add_want_deq_ntf (stream_session->rx_fifo,
- SVM_FIFO_WANT_DEQ_NOTIF_IF_FULL |
- SVM_FIFO_WANT_DEQ_NOTIF_IF_EMPTY);
-
- if (app_worker_connect_notify (app_wrk, stream_session, SESSION_E_NONE,
- sep->opaque))
- {
- QUIC_ERR ("Connect stream: failed to notify app");
- quic_increment_counter (qm, QUIC_ERROR_CLOSED_STREAM, 1);
- quic_eng_connect_stream_error_reset (stream);
- return -1;
- }
-
- return 0;
-}
-
static_always_inline void
quic_ctx_set_alpn_protos (quic_ctx_t *ctx, transport_endpt_crypto_cfg_t *ccfg)
{
}
static int
-quic_connect_connection (session_endpoint_cfg_t * sep)
+quic_connect_connection (transport_endpoint_cfg_t *tep)
{
+ session_endpoint_cfg_t *sep = (session_endpoint_cfg_t *) tep;
vnet_connect_args_t _cargs, *cargs = &_cargs;
transport_endpt_crypto_cfg_t *ccfg;
quic_main_t *qm = &quic_main;
}
static int
-quic_connect (transport_endpoint_cfg_t * tep)
-{
- session_endpoint_cfg_t *sep = (session_endpoint_cfg_t *) tep;
- session_t *quic_session;
- sep = (session_endpoint_cfg_t *) tep;
-
- quic_session = session_get_from_handle_if_valid (sep->parent_handle);
- if (quic_session)
- {
-#if CLIB_DEBUG > 0
- clib_warning ("deprecated, use vnet_connect_stream to open stream");
-#endif
- return quic_connect_stream (quic_session, sep);
- }
- else
- return quic_connect_connection (sep);
-}
-
-static int
-quic_proto_connect_stream (transport_endpoint_cfg_t *tep,
- session_t *stream_session, u32 *conn_index)
+quic_connect_stream (transport_endpoint_cfg_t *tep, session_t *stream_session,
+ u32 *conn_index)
{
quic_main_t *qm = &quic_main;
session_endpoint_cfg_t *sep = (session_endpoint_cfg_t *) tep;
static transport_proto_vft_t quic_proto = {
.enable = quic_enable,
- .connect = quic_connect,
- .connect_stream = quic_proto_connect_stream,
+ .connect = quic_connect_connection,
+ .connect_stream = quic_connect_stream,
.close = quic_proto_on_close,
.start_listen = quic_start_listen,
.stop_listen = quic_stop_listen,