aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNathan Skrzypczak <nathan.skrzypczak@gmail.com>2019-12-19 10:22:06 +0100
committerNathan Skrzypczak <nathan.skrzypczak@gmail.com>2019-12-19 11:00:25 +0100
commitcfffeae1e333c45e8417c9252432efbff28e371a (patch)
tree5810ae4b1da5b364dac145528a8daf82ed5c286f /src
parent64e9d28d375721c5308da3e8a45a52d88dd0ff40 (diff)
quic: fix accept failure
Type: fix Change-Id: Ic85cedae268a3abc452a2b1d4cc6672a464e2d2c Signed-off-by: Nathan Skrzypczak <nathan.skrzypczak@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/quic/quic.c46
1 files changed, 23 insertions, 23 deletions
diff --git a/src/plugins/quic/quic.c b/src/plugins/quic/quic.c
index 04c756a40b4..89df9ba89ec 100644
--- a/src/plugins/quic/quic.c
+++ b/src/plugins/quic/quic.c
@@ -1973,10 +1973,9 @@ quic_find_packet_ctx (quic_rx_packet_ctx_t * pctx, u32 caller_thread_index)
return QUIC_PACKET_TYPE_RECEIVE;
}
-static int
-quic_accept_connection (u32 ctx_index, quic_rx_packet_ctx_t * pctx)
+static void
+quic_accept_connection (quic_rx_packet_ctx_t * pctx)
{
- u32 thread_index = vlib_get_thread_index ();
quicly_context_t *quicly_ctx;
session_t *quic_session;
clib_bihash_kv_16_8_t kv;
@@ -1988,27 +1987,28 @@ quic_accept_connection (u32 ctx_index, quic_rx_packet_ctx_t * pctx)
/* new connection, accept and create context if packet is valid
* TODO: check if socket is actually listening? */
- ctx = quic_ctx_get (ctx_index, thread_index);
+ ctx = quic_ctx_get (pctx->ctx_index, pctx->thread_index);
if (ctx->c_s_index != QUIC_SESSION_INVALID)
{
QUIC_DBG (2, "already accepted ctx 0x%x", ctx_index);
- return 0;
+ return;
}
quicly_ctx = quic_get_quicly_ctx_from_ctx (ctx);
if ((rv = quicly_accept (&conn, quicly_ctx, NULL, &pctx->sa,
&pctx->packet, NULL,
- &quic_main.wrk_ctx[thread_index].next_cid, NULL)))
+ &quic_main.wrk_ctx[pctx->thread_index].next_cid,
+ NULL)))
{
/* Invalid packet, pass */
assert (conn == NULL);
QUIC_ERR ("Accept failed with %U", quic_format_err, rv);
/* TODO: cleanup created quic ctx and UDP session */
- return 0;
+ return;
}
assert (conn != NULL);
- ++quic_main.wrk_ctx[thread_index].next_cid.master_id;
+ ++quic_main.wrk_ctx[pctx->thread_index].next_cid.master_id;
/* Save ctx handle in quicly connection */
quic_store_conn_ctx (conn, ctx);
ctx->conn = conn;
@@ -2029,7 +2029,7 @@ quic_accept_connection (u32 ctx_index, quic_rx_packet_ctx_t * pctx)
/* Register connection in connections map */
quic_make_connection_key (&kv, quicly_get_master_id (conn));
- kv.value = ((u64) thread_index) << 32 | (u64) ctx_index;
+ kv.value = ((u64) pctx->thread_index) << 32 | (u64) pctx->ctx_index;
clib_bihash_add_del_16_8 (&quic_main.connection_hash, &kv, 1 /* is_add */ );
QUIC_DBG (2, "Registering conn with id %lu %lu", kv.key[0], kv.key[1]);
@@ -2037,23 +2037,19 @@ quic_accept_connection (u32 ctx_index, quic_rx_packet_ctx_t * pctx)
if ((rv = app_worker_init_accepted (quic_session)))
{
QUIC_ERR ("failed to allocate fifos");
- quic_proto_on_close (ctx_index, thread_index);
- return rv;
+ quic_proto_on_close (pctx->ctx_index, pctx->thread_index);
+ return;
}
app_wrk = app_worker_get (quic_session->app_wrk_index);
if ((rv = app_worker_accept_notify (app_wrk, quic_session)))
{
QUIC_ERR ("failed to notify accept worker app");
- quic_proto_on_close (ctx_index, thread_index);
- return rv;
+ quic_proto_on_close (pctx->ctx_index, pctx->thread_index);
+ return;
}
ctx->conn_state = QUIC_CONN_STATE_READY;
- pctx->ctx_index = ctx_index;
- pctx->thread_index = thread_index;
-
- return 0;
}
static int
@@ -2092,6 +2088,7 @@ quic_process_one_rx_packet (u64 udp_session_handle, svm_fifo_t * f,
u32 thread_index = vlib_get_thread_index ();
u32 cur_deq = svm_fifo_max_dequeue (f) - fifo_offset;
quicly_context_t *quicly_ctx;
+ session_t *udp_session;
int rv;
ret = svm_fifo_peek (f, fifo_offset,
@@ -2141,6 +2138,9 @@ quic_process_one_rx_packet (u64 udp_session_handle, svm_fifo_t * f,
else if (QUICLY_PACKET_IS_LONG_HEADER (pctx->packet.octets.base[0]))
{
pctx->ptype = QUIC_PACKET_TYPE_ACCEPT;
+ udp_session = session_get_from_handle (udp_session_handle);
+ pctx->ctx_index = udp_session->opaque;
+ pctx->thread_index = thread_index;
}
else
{
@@ -2177,6 +2177,11 @@ rx_start:
fifo_offset = 0;
max_packets = QUIC_RCV_MAX_BATCH_PACKETS;
+#if CLIB_DEBUG > 0
+ clib_memset (packets_ctx, 0xfa,
+ QUIC_RCV_MAX_BATCH_PACKETS * sizeof (quic_rx_packet_ctx_t));
+#endif
+
for (i = 0; i < max_packets; i++)
{
packets_ctx[i].thread_index = UINT32_MAX;
@@ -2222,12 +2227,7 @@ rx_start:
}
break;
case QUIC_PACKET_TYPE_ACCEPT:
- udp_session = session_get_from_handle (udp_session_handle);
- if ((rv = quic_accept_connection (udp_session->opaque,
- &packets_ctx[i])))
- {
- QUIC_ERR ("quic accept errored with %d", rv);
- }
+ quic_accept_connection (&packets_ctx[i]);
break;
case QUIC_PACKET_TYPE_RESET:
quic_reset_connection (udp_session_handle, &packets_ctx[i]);