QUIC: Add multi-stream support to internal test apps
[vpp.git] / src / vnet / session-apps / echo_server.c
index 4249ed8..7459d03 100644 (file)
 #include <vnet/session/application_interface.h>
 #include <vnet/session/session.h>
 
+#define ECHO_SERVER_DBG (0)
+#define DBG(_fmt, _args...)                    \
+    if (ECHO_SERVER_DBG)                               \
+      clib_warning (_fmt, ##_args)
+
 typedef struct
 {
   /*
@@ -49,6 +54,7 @@ typedef struct
   u8 **rx_buf;                 /**< Per-thread RX buffer */
   u64 byte_index;
   u32 **rx_retries;
+  u8 transport_proto;
 
   vlib_main_t *vlib_main;
 } echo_server_main_t;
@@ -56,10 +62,34 @@ typedef struct
 echo_server_main_t echo_server_main;
 
 int
-echo_server_session_accept_callback (session_t * s)
+quic_echo_server_qsession_accept_callback (session_t * s)
+{
+  DBG ("QSession %u accept w/opaque %d", s->session_index, s->opaque);
+  return 0;
+}
+
+int
+quic_echo_server_session_accept_callback (session_t * s)
 {
   echo_server_main_t *esm = &echo_server_main;
+  if (!(s->flags & SESSION_F_QUIC_STREAM))
+    return quic_echo_server_qsession_accept_callback (s);
+  DBG ("SSESSION %u accept w/opaque %d", s->session_index, s->opaque);
+
+  esm->vpp_queue[s->thread_index] =
+    session_main_get_vpp_event_queue (s->thread_index);
+  s->session_state = SESSION_STATE_READY;
+  esm->byte_index = 0;
+  ASSERT (vec_len (esm->rx_retries) > s->thread_index);
+  vec_validate (esm->rx_retries[s->thread_index], s->session_index);
+  esm->rx_retries[s->thread_index][s->session_index] = 0;
+  return 0;
+}
 
+int
+echo_server_session_accept_callback (session_t * s)
+{
+  echo_server_main_t *esm = &echo_server_main;
   esm->vpp_queue[s->thread_index] =
     session_main_get_vpp_event_queue (s->thread_index);
   s->session_state = SESSION_STATE_READY;
@@ -304,6 +334,9 @@ echo_server_attach (u8 * appns_id, u64 appns_flags, u64 appns_secret)
   else
     echo_server_session_cb_vft.builtin_app_rx_callback =
       echo_server_rx_callback;
+  if (esm->transport_proto == TRANSPORT_PROTO_QUIC)
+    echo_server_session_cb_vft.session_accept_callback =
+      quic_echo_server_session_accept_callback;
 
   if (esm->private_segment_size)
     segment_size = esm->private_segment_size;
@@ -426,6 +459,7 @@ echo_server_create_command_fn (vlib_main_t * vm, unformat_input_t * input,
   u64 tmp, appns_flags = 0, appns_secret = 0;
   char *default_uri = "tcp://0.0.0.0/1234";
   int rv, is_stop = 0;
+  session_endpoint_cfg_t sep = SESSION_ENDPOINT_CFG_NULL;
 
   esm->no_echo = 0;
   esm->fifo_size = 64 << 10;
@@ -434,7 +468,6 @@ echo_server_create_command_fn (vlib_main_t * vm, unformat_input_t * input,
   esm->private_segment_count = 0;
   esm->private_segment_size = 0;
   esm->tls_engine = TLS_ENGINE_OPENSSL;
-  esm->is_dgram = 0;
   vec_free (esm->server_uri);
 
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
@@ -503,8 +536,11 @@ echo_server_create_command_fn (vlib_main_t * vm, unformat_input_t * input,
       clib_warning ("No uri provided! Using default: %s", default_uri);
       esm->server_uri = (char *) format (0, "%s%c", default_uri, 0);
     }
-  if (esm->server_uri[0] == 'u' && esm->server_uri[3] != 'c')
-    esm->is_dgram = 1;
+
+  if ((rv = parse_uri ((char *) esm->server_uri, &sep)))
+    return clib_error_return (0, "Uri parse error: %d", rv);
+  esm->transport_proto = sep.transport_proto;
+  esm->is_dgram = (sep.transport_proto == TRANSPORT_PROTO_UDP);
 
   rv = echo_server_create (vm, appns_id, appns_flags, appns_secret);
   vec_free (appns_id);