diff options
author | Aloys Augustin <aloaugus@cisco.com> | 2019-09-05 17:58:21 +0200 |
---|---|---|
committer | Andrew Yourtchenko <ayourtch@gmail.com> | 2019-09-30 15:18:51 +0000 |
commit | 587eeecf0da4d245101831da51d755700dc65e7c (patch) | |
tree | 22b69204b21117e7a678d0e32415922a0816f348 | |
parent | 9636f97482e232d168a1693a44821f280f1b2de2 (diff) |
quic: fix server opening stream immediately
Previously, if the first thing a server did was to open a stream and
send data, this could trigger a crash on the clilent side VPP as the
quic session wouldn't be allocated.
Change-Id: I43990ce2a71217d6719ecae4da60111d05fbcfc0
Type: fix
Signed-off-by: Aloys Augustin <aloaugus@cisco.com>
(cherry picked from commit ffbfe3a2d6aaf4e847a1848c29fc8ce2997ed260)
-rw-r--r-- | src/plugins/quic/quic.c | 21 | ||||
-rw-r--r-- | src/plugins/quic/quic.h | 2 |
2 files changed, 19 insertions, 4 deletions
diff --git a/src/plugins/quic/quic.c b/src/plugins/quic/quic.c index 866aaadb6a8..42a839db515 100644 --- a/src/plugins/quic/quic.c +++ b/src/plugins/quic/quic.c @@ -33,6 +33,7 @@ static quic_main_t quic_main; static void quic_update_timer (quic_ctx_t * ctx); +static int quic_on_client_connected (quic_ctx_t * ctx); static u32 quic_ctx_alloc (u32 thread_index) @@ -595,6 +596,22 @@ quic_accept_stream (void *s) qctx = quic_get_conn_ctx (stream->conn); + /* Might need to signal that the connection is ready if the first thing the + * server does is open a stream */ + if (qctx->conn_state == QUIC_CONN_STATE_HANDSHAKE) + { + if (quicly_connection_is_ready (qctx->conn)) + { + qctx->conn_state = QUIC_CONN_STATE_READY; + if (quicly_is_client (qctx->conn)) + { + quic_on_client_connected (qctx); + /* ctx might be invalidated */ + qctx = quic_get_conn_ctx (stream->conn); + } + } + } + stream_session = session_alloc (qctx->c_thread_index); QUIC_DBG (2, "ACCEPTED stream_session 0x%lx ctx %u", session_handle (stream_session), sctx_id); @@ -652,9 +669,7 @@ quic_on_stream_open (quicly_stream_open_t * self, quicly_stream_t * stream) /* Notify accept on parent qsession, but only if this is not a locally * initiated stream */ if (!quicly_stream_is_self_initiated (stream)) - { - quic_accept_stream (stream); - } + quic_accept_stream (stream); return 0; } diff --git a/src/plugins/quic/quic.h b/src/plugins/quic/quic.h index f44bae29c47..5b821d77bae 100644 --- a/src/plugins/quic/quic.h +++ b/src/plugins/quic/quic.h @@ -158,7 +158,7 @@ typedef struct quic_main_ u32 app_index; quic_ctx_t **ctx_pool; quic_worker_ctx_t *wrk_ctx; - clib_bihash_16_8_t connection_hash; /* quicly connection id -> conn handle */ + clib_bihash_16_8_t connection_hash; /* quic connection id -> conn handle */ f64 tstamp_ticks_per_clock; ptls_cipher_suite_t ***quic_ciphers; /* available ciphers by crypto engine */ |