X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fudp%2Fbuiltin_server.c;h=4c9573e7f82fe940e06d8efca6f6cfa78231caf1;hb=b384b543313b6b47a277c903e9d4fcd4343054fa;hp=afa66ba4453b0b09aad0606b8d2337f9fcc3a66e;hpb=68b0fb0c620c7451ef1a6380c43c39de6614db51;p=vpp.git diff --git a/src/vnet/udp/builtin_server.c b/src/vnet/udp/builtin_server.c index afa66ba4453..4c9573e7f82 100644 --- a/src/vnet/udp/builtin_server.c +++ b/src/vnet/udp/builtin_server.c @@ -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_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) /* *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);