session udp: fix transport flags and migration
[vpp.git] / src / plugins / quic / quic.c
index 5265e5b..14002a2 100644 (file)
@@ -784,7 +784,7 @@ quic_on_stream_destroy (quicly_stream_t * stream, int err)
   clib_mem_free (stream->data);
 }
 
-static int
+static void
 quic_on_stop_sending (quicly_stream_t * stream, int err)
 {
 #if QUIC_DEBUG >= 2
@@ -797,10 +797,9 @@ quic_on_stop_sending (quicly_stream_t * stream, int err)
                session_handle (stream_session), quic_format_err, err);
 #endif
   /* TODO : handle STOP_SENDING */
-  return 0;
 }
 
-static int
+static void
 quic_on_receive_reset (quicly_stream_t * stream, int err)
 {
   quic_stream_data_t *stream_data = (quic_stream_data_t *) stream->data;
@@ -813,10 +812,9 @@ quic_on_receive_reset (quicly_stream_t * stream, int err)
                session_handle (stream_session), quic_format_err, err);
 #endif
   session_transport_closing_notify (&sctx->connection);
-  return 0;
 }
 
-static int
+static void
 quic_on_receive (quicly_stream_t * stream, size_t off, const void *src,
                 size_t len)
 {
@@ -846,7 +844,7 @@ quic_on_receive (quicly_stream_t * stream, size_t off, const void *src,
                stream_session->thread_index, f,
                max_enq, len, stream_data->app_rx_data_len, off,
                off - stream_data->app_rx_data_len + len);
-      return 0;
+      return;
     }
   if (PREDICT_FALSE ((off - stream_data->app_rx_data_len + len) > max_enq))
     {
@@ -858,7 +856,7 @@ quic_on_receive (quicly_stream_t * stream, size_t off, const void *src,
                stream_session->thread_index, f,
                max_enq, len, stream_data->app_rx_data_len, off,
                off - stream_data->app_rx_data_len + len);
-      return 1;
+      return;                  /* This shouldn't happen */
     }
   if (off == stream_data->app_rx_data_len)
     {
@@ -888,7 +886,7 @@ quic_on_receive (quicly_stream_t * stream, size_t off, const void *src,
                                           len, (u8 *) src);
       QUIC_ASSERT (rlen == 0);
     }
-  return 0;
+  return;
 }
 
 void
@@ -912,14 +910,14 @@ quic_fifo_egress_shift (quicly_stream_t * stream, size_t delta)
   QUIC_ASSERT (!rv);
 }
 
-int
+void
 quic_fifo_egress_emit (quicly_stream_t * stream, size_t off, void *dst,
                       size_t * len, int *wrote_all)
 {
-  u32 deq_max, first_deq, max_rd_chunk, rem_offset;
   quic_stream_data_t *stream_data;
   session_t *stream_session;
   svm_fifo_t *f;
+  u32 deq_max;
 
   stream_data = (quic_stream_data_t *) stream->data;
   stream_session = get_stream_session_from_stream (stream);
@@ -943,24 +941,7 @@ quic_fifo_egress_emit (quicly_stream_t * stream, size_t off, void *dst,
   if (off + *len > stream_data->app_tx_data_len)
     stream_data->app_tx_data_len = off + *len;
 
-  /* TODO, use something like : return svm_fifo_peek (f, off, *len, dst); */
-  max_rd_chunk = svm_fifo_max_read_chunk (f);
-
-  first_deq = 0;
-  if (off < max_rd_chunk)
-    {
-      first_deq = clib_min (*len, max_rd_chunk - off);
-      clib_memcpy_fast (dst, svm_fifo_head (f) + off, first_deq);
-    }
-
-  if (max_rd_chunk < off + *len)
-    {
-      rem_offset = max_rd_chunk < off ? off - max_rd_chunk : 0;
-      clib_memcpy_fast (dst + first_deq, f->head_chunk->data + rem_offset,
-                       *len - first_deq);
-    }
-
-  return 0;
+  svm_fifo_peek (f, off, *len, dst);
 }
 
 static const quicly_stream_callbacks_t quic_stream_callbacks = {
@@ -1201,6 +1182,7 @@ quic_connect_stream (session_t * quic_session, session_endpoint_cfg_t * sep)
   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 */
@@ -1244,9 +1226,8 @@ quic_connect_stream (session_t * quic_session, session_endpoint_cfg_t * sep)
   if (!conn || !quicly_connection_is_ready (conn))
     return -1;
 
-  if ((rv =
-       quicly_open_stream (conn, &stream,
-                          sep->flags & SESSION_F_UNIDIRECTIONAL)))
+  is_unidir = sep->transport_flags & TRANSPORT_CFG_F_UNIDIRECTIONAL;
+  if ((rv = quicly_open_stream (conn, &stream, is_unidir)))
     {
       QUIC_DBG (2, "Stream open failed with %d", rv);
       return -1;
@@ -1265,7 +1246,7 @@ quic_connect_stream (session_t * quic_session, session_endpoint_cfg_t * sep)
   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)
+  if (is_unidir)
     stream_session->flags |= SESSION_F_UNIDIRECTIONAL;
 
   sctx->c_s_index = stream_session->session_index;
@@ -1331,7 +1312,7 @@ quic_connect_connection (session_endpoint_cfg_t * sep)
   vec_terminate_c_string (ctx->srv_hostname);
 
   clib_memcpy (&cargs->sep, sep, sizeof (session_endpoint_cfg_t));
-  cargs->sep.transport_proto = TRANSPORT_PROTO_UDPC;
+  cargs->sep.transport_proto = TRANSPORT_PROTO_UDP;
   cargs->app_index = qm->app_index;
   cargs->api_context = ctx_index;
 
@@ -1339,6 +1320,7 @@ quic_connect_connection (session_endpoint_cfg_t * sep)
   app = application_get (app_wrk->app_index);
   ctx->parent_app_id = app_wrk->app_index;
   cargs->sep_ext.ns_index = app->ns_index;
+  cargs->sep_ext.transport_flags = TRANSPORT_CFG_F_CONNECTED;
 
   ctx->crypto_engine = sep->crypto_engine;
   ctx->ckpair_index = sep->ckpair_index;
@@ -1446,7 +1428,8 @@ quic_start_listen (u32 quic_listen_session_index, transport_endpoint_t * tep)
   args->app_index = qm->app_index;
   args->sep_ext = *sep;
   args->sep_ext.ns_index = app->ns_index;
-  args->sep_ext.transport_proto = TRANSPORT_PROTO_UDPC;
+  args->sep_ext.transport_proto = TRANSPORT_PROTO_UDP;
+  args->sep_ext.transport_flags = TRANSPORT_CFG_F_CONNECTED;
   if ((rv = vnet_listen (args)))
     return rv;
 
@@ -2195,8 +2178,11 @@ quic_process_one_rx_packet (u64 udp_session_handle, svm_fifo_t * f,
   if (rv == QUIC_PACKET_TYPE_RECEIVE)
     {
       pctx->ptype = QUIC_PACKET_TYPE_RECEIVE;
-      quic_ctx_t *qctx = quic_ctx_get (pctx->ctx_index, thread_index);
-      quic_crypto_decrypt_packet (qctx, pctx);
+      if (quic_main.vnet_crypto_enabled)
+       {
+         quic_ctx_t *qctx = quic_ctx_get (pctx->ctx_index, thread_index);
+         quic_crypto_decrypt_packet (qctx, pctx);
+       }
       return 0;
     }
   else if (rv == QUIC_PACKET_TYPE_MIGRATE)
@@ -2410,6 +2396,8 @@ static const transport_proto_vft_t quic_proto = {
   .get_transport_endpoint = quic_get_transport_endpoint,
   .get_transport_listener_endpoint = quic_get_transport_listener_endpoint,
   .transport_options = {
+    .name = "quic",
+    .short_name = "Q",
     .tx_type = TRANSPORT_TX_INTERNAL,
     .service_type = TRANSPORT_SERVICE_APP,
   },
@@ -2521,6 +2509,13 @@ quic_init (vlib_main_t * vm)
   qm->default_crypto_engine = CRYPTO_ENGINE_VPP;
   qm->max_packets_per_key = DEFAULT_MAX_PACKETS_PER_KEY;
   clib_rwlock_init (&qm->crypto_keys_quic_rw_lock);
+
+  vnet_crypto_main_t *cm = &crypto_main;
+  if (vec_len (cm->engines) == 0)
+    qm->vnet_crypto_enabled = 0;
+  else
+    qm->vnet_crypto_enabled = 1;
+
   vec_free (a->name);
   return 0;
 }