summaryrefslogtreecommitdiffstats
path: root/src/vnet/session-apps/echo_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/session-apps/echo_server.c')
-rw-r--r--src/vnet/session-apps/echo_server.c44
1 files changed, 40 insertions, 4 deletions
diff --git a/src/vnet/session-apps/echo_server.c b/src/vnet/session-apps/echo_server.c
index 4249ed83292..7459d03202f 100644
--- a/src/vnet/session-apps/echo_server.c
+++ b/src/vnet/session-apps/echo_server.c
@@ -19,6 +19,11 @@
#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);