diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/vnet/session/node.c | 6 | ||||
-rw-r--r-- | src/vnet/session/session.h | 10 | ||||
-rw-r--r-- | src/vnet/tcp/builtin_http_server.c | 21 |
3 files changed, 35 insertions, 2 deletions
diff --git a/src/vnet/session/node.c b/src/vnet/session/node.c index ce7c38683f5..fffc8eb385a 100644 --- a/src/vnet/session/node.c +++ b/src/vnet/session/node.c @@ -401,6 +401,7 @@ session_queue_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, u32 my_thread_index = vm->thread_index; int i, rv; f64 now = vlib_time_now (vm); + void (*fp) (void *); SESSION_EVT_DBG (SESSION_EVT_POLL_GAP_TRACK, smm, my_thread_index); @@ -496,6 +497,11 @@ skip_dequeue: app = application_get (s0->app_index); app->cb_fns.builtin_server_rx_callback (s0); break; + case FIFO_EVENT_RPC: + fp = e0->rpc_args.fp; + (*fp) (e0->rpc_args.arg); + break; + default: clib_warning ("unhandled event type %d", e0->event_type); } diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h index 5c281df7854..efb9e30b5cc 100644 --- a/src/vnet/session/session.h +++ b/src/vnet/session/session.h @@ -32,7 +32,8 @@ typedef enum FIFO_EVENT_APP_TX, FIFO_EVENT_TIMEOUT, FIFO_EVENT_DISCONNECT, - FIFO_EVENT_BUILTIN_RX + FIFO_EVENT_BUILTIN_RX, + FIFO_EVENT_RPC, } fifo_event_type_t; #define foreach_session_input_error \ @@ -91,12 +92,19 @@ typedef enum SESSION_STATE_N_STATES, } stream_session_state_t; +typedef struct +{ + void *fp; + void *arg; +} rpc_args_t; + /* *INDENT-OFF* */ typedef CLIB_PACKED (struct { union { svm_fifo_t * fifo; u64 session_handle; + rpc_args_t rpc_args; }; u8 event_type; u16 event_id; diff --git a/src/vnet/tcp/builtin_http_server.c b/src/vnet/tcp/builtin_http_server.c index 4e61fbd1aa8..763a46e9590 100644 --- a/src/vnet/tcp/builtin_http_server.c +++ b/src/vnet/tcp/builtin_http_server.c @@ -385,6 +385,13 @@ builtin_redirect_connect_callback (u32 client_index, void *mp) return -1; } +static void +alloc_http_process_callback (void *s_arg) +{ + stream_session_t *s = (stream_session_t *) s_arg; + alloc_http_process (s); +} + static int http_server_rx_callback (stream_session_t * s) { @@ -414,7 +421,19 @@ http_server_rx_callback (stream_session_t * s) /* send the command to a new/recycled vlib process */ s->opaque[1] = (u64) vec_dup (hsm->rx_buf); - alloc_http_process (s); + /* Send an RPC request via the thread-0 input node */ + if (vlib_get_thread_index () != 0) + { + session_fifo_event_t evt; + evt.rpc_args.fp = alloc_http_process_callback; + evt.rpc_args.arg = s; + evt.event_type = FIFO_EVENT_RPC; + unix_shared_memory_queue_add + (session_manager_get_vpp_event_queue (0 /* main thread */ ), + (u8 *) & evt, 0 /* do wait for mutex */ ); + } + else + alloc_http_process (s); return 0; } |