sctx->stream = stream;
sctx->c_flags |= TRANSPORT_CONNECTION_F_NO_LOOKUP;
sctx->flags |= QUIC_F_IS_STREAM;
+ if (quicly_stream_is_unidirectional (stream->stream_id))
+ stream_session->flags |= SESSION_F_UNIDIRECTIONAL;
stream_data = (quic_stream_data_t *) stream->data;
stream_data->ctx_id = sctx_id;
/* Transport proto functions */
static int
-quic_connect_stream (session_t * quic_session, u32 opaque)
+quic_connect_stream (session_t * quic_session, session_endpoint_cfg_t * sep)
{
uint64_t quic_session_handle;
session_t *stream_session;
if (!conn || !quicly_connection_is_ready (conn))
return -1;
- if ((rv = quicly_open_stream (conn, &stream, 0 /* uni */ )))
+ if ((rv =
+ quicly_open_stream (conn, &stream,
+ sep->flags & SESSION_F_UNIDIRECTIONAL)))
{
QUIC_DBG (2, "Stream open failed with %d", rv);
return -1;
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 (sep->flags & SESSION_F_UNIDIRECTIONAL)
+ stream_session->flags |= SESSION_F_UNIDIRECTIONAL;
sctx->c_s_index = stream_session->session_index;
stream_data = (quic_stream_data_t *) stream->data;
{
QUIC_ERR ("failed to app_worker_init_connected");
quicly_reset_stream (stream, QUIC_APP_CONNECT_NOTIFY_ERROR);
- return app_worker_connect_notify (app_wrk, NULL, opaque);
+ return app_worker_connect_notify (app_wrk, NULL, sep->opaque);
}
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, opaque))
+ if (app_worker_connect_notify (app_wrk, stream_session, sep->opaque))
{
QUIC_ERR ("failed to notify app");
quic_increment_counter (QUIC_ERROR_CLOSED_STREAM, 1);
quic_session = session_get_from_handle_if_valid (sep->parent_handle);
if (quic_session)
- return quic_connect_stream (quic_session, sep->opaque);
+ return quic_connect_stream (quic_session, sep);
else
return quic_connect_connection (sep);
}
if (quic_ctx_is_stream (ctx))
{
quicly_stream_t *stream = ctx->stream;
+ if (!quicly_stream_has_send_side (quicly_is_client (stream->conn),
+ stream->stream_id))
+ return;
quicly_reset_stream (stream, QUIC_APP_ERROR_CLOSE_NOTIFY);
quic_send_packets (ctx);
return;
quicly_ctx = quic_get_quicly_ctx_from_ctx (ctx);
ret = quicly_connect (&ctx->conn, quicly_ctx, (char *) ctx->srv_hostname,
- sa, NULL, &quic_main.next_cid, ptls_iovec_init (NULL,
- 0),
- &quic_main.hs_properties, NULL);
- ++quic_main.next_cid.master_id;
+ sa, NULL, &quic_main.wrk_ctx[thread_index].next_cid,
+ ptls_iovec_init (NULL, 0), &quic_main.hs_properties,
+ NULL);
+ ++quic_main.wrk_ctx[thread_index].next_cid.master_id;
/* Save context handle in quicly connection */
quic_store_conn_ctx (ctx->conn, ctx);
assert (ret == 0);
u32 new_thread = session_thread_from_handle (new_sh);
quic_ctx_t *ctx;
- QUIC_ERR ("Session %x migrated to %lx", s->session_index, new_sh);
+ QUIC_DBG (2, "Session %x migrated to %lx", s->session_index, new_sh);
QUIC_ASSERT (vlib_get_thread_index () == s->thread_index);
ctx = quic_ctx_get (s->opaque, s->thread_index);
QUIC_ASSERT (ctx->udp_session_handle == session_handle (s));
quicly_ctx = quic_get_quicly_ctx_from_ctx (ctx);
if ((rv = quicly_accept (&conn, quicly_ctx, NULL, &pctx->sa,
- &pctx->packet, NULL, &quic_main.next_cid, NULL)))
+ &pctx->packet, NULL,
+ &quic_main.wrk_ctx[thread_index].next_cid, NULL)))
{
/* Invalid packet, pass */
assert (conn == NULL);
}
assert (conn != NULL);
- ++quic_main.next_cid.master_id;
+ ++quic_main.wrk_ctx[thread_index].next_cid.master_id;
/* Save ctx handle in quicly connection */
quic_store_conn_ctx (conn, ctx);
ctx->conn = conn;
/* Timer wheels, one per thread. */
for (i = 0; i < num_threads; i++)
{
+ qm->wrk_ctx[i].next_cid.thread_id = i;
tw = &qm->wrk_ctx[i].timer_wheel;
tw_timer_wheel_init_1t_3w_1024sl_ov (tw, quic_expired_timers_dispatch,
1e-3 /* timer period 1ms */ , ~0);