summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAloys Augustin <aloaugus@cisco.com>2019-09-05 17:58:21 +0200
committerAndrew Yourtchenko <ayourtch@gmail.com>2019-09-30 15:18:51 +0000
commit587eeecf0da4d245101831da51d755700dc65e7c (patch)
tree22b69204b21117e7a678d0e32415922a0816f348
parent9636f97482e232d168a1693a44821f280f1b2de2 (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.c21
-rw-r--r--src/plugins/quic/quic.h2
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 */