session: add support for memfd segments
[vpp.git] / src / vnet / udp / builtin_server.c
index 46c8e73..4c9573e 100644 (file)
@@ -23,6 +23,7 @@
 
 /** per-worker built-in server copy buffers */
 u8 **copy_buffers;
+static int app_index = ~0;
 
 static int
 builtin_session_create_callback (stream_session_t * s)
@@ -38,43 +39,59 @@ builtin_session_disconnect_callback (stream_session_t * s)
   stream_session_disconnect (s);
 }
 
+static void
+builtin_session_reset_callback (stream_session_t * s)
+{
+  clib_warning ("Reset session %U", format_stream_session, s, 2);
+  stream_session_cleanup (s);
+}
+
 static int
-builtin_server_rx_callback (stream_session_t * s, session_fifo_event_t * ep)
+builtin_session_connected_callback (u32 app_index, u32 api_context,
+                                   stream_session_t * s, u8 is_fail)
+{
+  clib_warning ("called...");
+  return -1;
+}
+
+static int
+builtin_server_rx_callback (stream_session_t * s)
 {
   svm_fifo_t *rx_fifo, *tx_fifo;
-  u32 this_transfer;
+  u32 this_transfer, max_deq, max_enq;
   int actual_transfer;
   u8 *my_copy_buffer;
   session_fifo_event_t evt;
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
 
   my_copy_buffer = copy_buffers[s->thread_index];
   rx_fifo = s->server_rx_fifo;
   tx_fifo = s->server_tx_fifo;
 
-  this_transfer = svm_fifo_max_enqueue (tx_fifo)
-    < svm_fifo_max_dequeue (rx_fifo) ?
-    svm_fifo_max_enqueue (tx_fifo) : svm_fifo_max_dequeue (rx_fifo);
+  max_deq = svm_fifo_max_dequeue (rx_fifo);
+  max_enq = svm_fifo_max_enqueue (tx_fifo);
+  this_transfer = max_enq < max_deq ? max_enq : max_deq;
 
   vec_validate (my_copy_buffer, this_transfer - 1);
   _vec_len (my_copy_buffer) = this_transfer;
 
-  actual_transfer = svm_fifo_dequeue_nowait (rx_fifo, 0, this_transfer,
+  actual_transfer = svm_fifo_dequeue_nowait (rx_fifo, this_transfer,
                                             my_copy_buffer);
   ASSERT (actual_transfer == this_transfer);
-  actual_transfer = svm_fifo_enqueue_nowait (tx_fifo, 0, this_transfer,
+  actual_transfer = svm_fifo_enqueue_nowait (tx_fifo, this_transfer,
                                             my_copy_buffer);
+  ASSERT (actual_transfer == this_transfer);
 
   copy_buffers[s->thread_index] = my_copy_buffer;
 
-  /* Fabricate TX event, send to ourselves */
-  evt.fifo = tx_fifo;
-  evt.event_type = FIFO_EVENT_SERVER_TX;
-  /* $$$$ for event logging */
-  evt.enqueue_length = actual_transfer;
-  evt.event_id = 0;
-  q = session_manager_get_vpp_event_queue (s->thread_index);
-  unix_shared_memory_queue_add (q, (u8 *) & evt, 0 /* do wait for mutex */ );
+  if (svm_fifo_set_event (tx_fifo))
+    {
+      /* Fabricate TX event, send to ourselves */
+      evt.fifo = tx_fifo;
+      evt.event_type = FIFO_EVENT_APP_TX;
+      q = session_manager_get_vpp_event_queue (s->thread_index);
+      svm_queue_add (q, (u8 *) & evt, 0 /* do wait for mutex */ );
+    }
 
   return 0;
 }
@@ -82,35 +99,53 @@ builtin_server_rx_callback (stream_session_t * s, session_fifo_event_t * ep)
 /* *INDENT-OFF* */
 static session_cb_vft_t builtin_server = {
     .session_accept_callback = builtin_session_create_callback,
+    .session_connected_callback = builtin_session_connected_callback,
     .session_disconnect_callback = builtin_session_disconnect_callback,
-    .builtin_server_rx_callback = builtin_server_rx_callback
+    .builtin_server_rx_callback = builtin_server_rx_callback,
+    .session_reset_callback = builtin_session_reset_callback
 };
 /* *INDENT-ON* */
 
 static int
-bind_builtin_uri_server (u8 * uri)
+attach_builtin_uri_server ()
 {
-  vnet_bind_args_t _a, *a = &_a;
-  char segment_name[128];
-  u32 segment_name_length;
-  int rv;
+  vnet_app_attach_args_t _a, *a = &_a;
   u64 options[16];
 
-  segment_name_length = ARRAY_LEN (segment_name);
-
   memset (a, 0, sizeof (*a));
   memset (options, 0, sizeof (options));
 
-  a->uri = (char *) uri;
-  a->api_client_index = ~0;    /* built-in server */
-  a->segment_name = segment_name;
-  a->segment_name_length = segment_name_length;
+  a->api_client_index = ~0;
   a->session_cb_vft = &builtin_server;
 
-  options[SESSION_OPTIONS_ACCEPT_COOKIE] = 0x12345678;
-  options[SESSION_OPTIONS_SEGMENT_SIZE] = (2 << 30);   /*$$$$ config / arg */
+  options[APP_OPTIONS_ACCEPT_COOKIE] = 0x12345678;
+  options[APP_OPTIONS_SEGMENT_SIZE] = (2 << 30);       /*$$$$ config / arg */
+  options[APP_OPTIONS_FLAGS] = APP_OPTIONS_FLAGS_IS_BUILTIN;
+  options[APP_OPTIONS_PREALLOC_FIFO_PAIRS] = 1024;
+
   a->options = options;
 
+  if (vnet_application_attach (a))
+    return -1;
+
+  app_index = a->app_index;
+  return 0;
+}
+
+static int
+bind_builtin_uri_server (u8 * uri)
+{
+  vnet_bind_args_t _a, *a = &_a;
+  int rv;
+
+  rv = attach_builtin_uri_server ();
+  if (rv)
+    return rv;
+
+  memset (a, 0, sizeof (*a));
+  a->uri = (char *) uri;
+  a->app_index = app_index;
+
   rv = vnet_bind_uri (a);
 
   return rv;
@@ -119,11 +154,12 @@ bind_builtin_uri_server (u8 * uri)
 static int
 unbind_builtin_uri_server (u8 * uri)
 {
-  int rv;
+  vnet_unbind_args_t _a, *a = &_a;
 
-  rv = vnet_unbind_uri ((char *) uri, ~0 /* client_index */ );
+  a->app_index = app_index;
+  a->uri = (char *) uri;
 
-  return rv;
+  return vnet_unbind_uri (a);
 }
 
 static clib_error_t *
@@ -159,6 +195,8 @@ builtin_uri_bind_command_fn (vlib_main_t * vm,
   if (uri == 0)
     return clib_error_return (0, "uri to bind not specified...");
 
+  vnet_session_enable_disable (vm, 1 /* turn on UDP, etc. */ );
+
   rv = bind_builtin_uri_server (uri);
 
   vec_free (uri);