summaryrefslogtreecommitdiffstats
path: root/src/vnet/tcp/builtin_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/tcp/builtin_server.c')
-rw-r--r--src/vnet/tcp/builtin_server.c94
1 files changed, 89 insertions, 5 deletions
diff --git a/src/vnet/tcp/builtin_server.c b/src/vnet/tcp/builtin_server.c
index be65642ae3b..9b697a01d5f 100644
--- a/src/vnet/tcp/builtin_server.c
+++ b/src/vnet/tcp/builtin_server.c
@@ -18,10 +18,24 @@
#include <vnet/session/application.h>
#include <vnet/session/application_interface.h>
+typedef struct
+{
+ u8 *rx_buf;
+ unix_shared_memory_queue_t **vpp_queue;
+ vlib_main_t *vlib_main;
+} builtin_server_main_t;
+
+builtin_server_main_t builtin_server_main;
+
+
int
builtin_session_accept_callback (stream_session_t * s)
{
+ builtin_server_main_t *bsm = &builtin_server_main;
clib_warning ("called...");
+
+ bsm->vpp_queue[s->thread_index] =
+ session_manager_get_vpp_event_queue (s->thread_index);
s->session_state = SESSION_STATE_READY;
return 0;
}
@@ -30,8 +44,19 @@ void
builtin_session_disconnect_callback (stream_session_t * s)
{
clib_warning ("called...");
+
+ vnet_disconnect_session (s->session_index, s->thread_index);
}
+void
+builtin_session_reset_callback (stream_session_t * s)
+{
+ clib_warning ("called.. ");
+
+ stream_session_cleanup (s);
+}
+
+
int
builtin_session_connected_callback (u32 client_index,
stream_session_t * s, u8 is_fail)
@@ -56,9 +81,57 @@ builtin_redirect_connect_callback (u32 client_index, void *mp)
}
int
-builtin_server_rx_callback (stream_session_t * s)
+builtin_server_rx_callback (stream_session_t * s, session_fifo_event_t * e)
{
- clib_warning ("called...");
+ int n_written, bytes, total_copy_bytes;
+ int n_read;
+ svm_fifo_t *tx_fifo;
+ builtin_server_main_t *bsm = &builtin_server_main;
+ session_fifo_event_t evt;
+ static int serial_number = 0;
+
+ bytes = e->enqueue_length;
+ if (PREDICT_FALSE (bytes <= 0))
+ {
+ clib_warning ("bizarre rx callback: bytes %d", bytes);
+ return 0;
+ }
+
+ tx_fifo = s->server_tx_fifo;
+
+ /* Number of bytes we're going to copy */
+ total_copy_bytes = (bytes < (tx_fifo->nitems - tx_fifo->cursize)) ? bytes :
+ tx_fifo->nitems - tx_fifo->cursize;
+
+ if (PREDICT_FALSE (total_copy_bytes <= 0))
+ {
+ clib_warning ("no space in tx fifo, event had %d bytes", bytes);
+ return 0;
+ }
+
+ vec_validate (bsm->rx_buf, total_copy_bytes - 1);
+ _vec_len (bsm->rx_buf) = total_copy_bytes;
+
+ n_read = svm_fifo_dequeue_nowait (s->server_rx_fifo, 0, total_copy_bytes,
+ bsm->rx_buf);
+ ASSERT (n_read == total_copy_bytes);
+
+ /*
+ * Echo back
+ */
+
+ n_written = svm_fifo_enqueue_nowait (tx_fifo, 0, n_read, bsm->rx_buf);
+ ASSERT (n_written == total_copy_bytes);
+
+ /* Fabricate TX event, send to vpp */
+ evt.fifo = tx_fifo;
+ evt.event_type = FIFO_EVENT_SERVER_TX;
+ evt.enqueue_length = total_copy_bytes;
+ evt.event_id = serial_number++;
+
+ unix_shared_memory_queue_add (bsm->vpp_queue[s->thread_index], (u8 *) & evt,
+ 0 /* do wait for mutex */ );
+
return 0;
}
@@ -68,7 +141,8 @@ static session_cb_vft_t builtin_session_cb_vft = {
.session_connected_callback = builtin_session_connected_callback,
.add_segment_callback = builtin_add_segment_callback,
.redirect_connect_callback = builtin_redirect_connect_callback,
- .builtin_server_rx_callback = builtin_server_rx_callback
+ .builtin_server_rx_callback = builtin_server_rx_callback,
+ .session_reset_callback = builtin_session_reset_callback
};
static int
@@ -77,6 +151,11 @@ server_create (vlib_main_t * vm)
vnet_bind_args_t _a, *a = &_a;
u64 options[SESSION_OPTIONS_N_OPTIONS];
char segment_name[128];
+ u32 num_threads;
+ vlib_thread_main_t *vtm = vlib_get_thread_main ();
+
+ num_threads = 1 /* main thread */ + vtm->n_threads;
+ vec_validate (builtin_server_main.vpp_queue, num_threads - 1);
memset (a, 0, sizeof (*a));
memset (options, 0, sizeof (options));
@@ -110,6 +189,7 @@ server_create_command_fn (vlib_main_t * vm,
}
#endif
+ vnet_session_enable_disable (vm, 1 /* turn on TCP, etc. */ );
rv = server_create (vm);
switch (rv)
{
@@ -121,10 +201,14 @@ server_create_command_fn (vlib_main_t * vm,
return 0;
}
+/* *INDENT-OFF* */
VLIB_CLI_COMMAND (server_create_command, static) =
{
-.path = "test server",.short_help = "test server",.function =
- server_create_command_fn,};
+ .path = "test server",
+ .short_help = "test server",
+ .function = server_create_command_fn,
+};
+/* *INDENT-ON* */
/*
* fd.io coding-style-patch-verification: ON