X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fapplication.c;h=65d2f08ddcad7db107f0801dd16c5781023add52;hb=61ae056bd;hp=8d8e17c8943755ffc67ef8d19fef5aaad4bcbc19;hpb=cfdb109180cb01c17f92a465f925c244259ba06b;p=vpp.git diff --git a/src/vnet/session/application.c b/src/vnet/session/application.c index 8d8e17c8943..65d2f08ddca 100644 --- a/src/vnet/session/application.c +++ b/src/vnet/session/application.c @@ -115,7 +115,7 @@ app_listener_lookup (application_t * app, session_endpoint_cfg_t * sep_ext) } fib_proto = session_endpoint_fib_proto (sep); - table_index = application_session_table (app, fib_proto); + table_index = session_lookup_get_index_for_fib (fib_proto, sep->fib_index); handle = session_lookup_endpoint_listener (table_index, sep, 1); if (handle != SESSION_INVALID_HANDLE) { @@ -133,10 +133,10 @@ app_listener_alloc_and_init (application_t * app, { app_listener_t *app_listener; transport_connection_t *tc; + u32 al_index, table_index; session_handle_t lh; session_type_t st; session_t *ls = 0; - u32 al_index; int rv; app_listener = app_listener_alloc (app); @@ -151,7 +151,6 @@ app_listener_alloc_and_init (application_t * app, && session_endpoint_is_local ((session_endpoint_t *) sep)) { session_type_t local_st; - u32 table_index; local_st = session_type_from_proto_and_ip (TRANSPORT_PROTO_NONE, sep->is_ip4); @@ -213,7 +212,16 @@ app_listener_alloc_and_init (application_t * app, * connections */ tc = session_get_transport (ls); if (!(tc->flags & TRANSPORT_CONNECTION_F_NO_LOOKUP)) - session_lookup_add_connection (tc, lh); + { + fib_protocol_t fib_proto; + fib_proto = session_endpoint_fib_proto ((session_endpoint_t *) sep); + table_index = session_lookup_get_index_for_fib (fib_proto, + sep->fib_index); + ASSERT (table_index != SESSION_TABLE_INVALID_INDEX); + session_lookup_add_session_endpoint (table_index, + (session_endpoint_t *) sep, + lh); + } } if (!ls) @@ -485,7 +493,11 @@ application_alloc_and_init (app_init_args_t * a) /* * Make sure we support the requested configuration */ - if (!(options[APP_OPTIONS_FLAGS] & APP_OPTIONS_FLAGS_IS_BUILTIN)) + if (options[APP_OPTIONS_FLAGS] & APP_OPTIONS_FLAGS_IS_BUILTIN) + { + seg_type = SSVM_SEGMENT_PRIVATE; + } + else if (!a->use_sock_api) { reg = vl_api_client_index_to_registration (a->api_client_index); if (!reg) @@ -493,10 +505,6 @@ application_alloc_and_init (app_init_args_t * a) if (vl_api_registration_file_index (reg) == VL_API_INVALID_FI) seg_type = SSVM_SEGMENT_SHM; } - else - { - seg_type = SSVM_SEGMENT_PRIVATE; - } if ((options[APP_OPTIONS_FLAGS] & APP_OPTIONS_FLAGS_EVT_MQ_USE_EVENTFD) && seg_type != SSVM_SEGMENT_MEMFD) @@ -509,6 +517,10 @@ application_alloc_and_init (app_init_args_t * a) if (!application_verify_cfg (seg_type)) return VNET_API_ERROR_APP_UNSUPPORTED_CFG; + if (options[APP_OPTIONS_PREALLOC_FIFO_PAIRS] + && options[APP_OPTIONS_PREALLOC_FIFO_HDRS]) + return VNET_API_ERROR_APP_UNSUPPORTED_CFG; + /* Check that the obvious things are properly set up */ application_verify_cb_fns (a->session_cb_vft); @@ -527,6 +539,7 @@ application_alloc_and_init (app_init_args_t * a) segment_manager_props_init (props); props->segment_size = options[APP_OPTIONS_SEGMENT_SIZE]; props->prealloc_fifos = options[APP_OPTIONS_PREALLOC_FIFO_PAIRS]; + props->prealloc_fifo_hdrs = options[APP_OPTIONS_PREALLOC_FIFO_HDRS]; if (options[APP_OPTIONS_ADD_SEGMENT_SIZE]) { props->add_segment_size = options[APP_OPTIONS_ADD_SEGMENT_SIZE]; @@ -542,6 +555,14 @@ application_alloc_and_init (app_init_args_t * a) props->use_mq_eventfd = 1; if (options[APP_OPTIONS_TLS_ENGINE]) app->tls_engine = options[APP_OPTIONS_TLS_ENGINE]; + if (options[APP_OPTIONS_MAX_FIFO_SIZE]) + props->max_fifo_size = options[APP_OPTIONS_MAX_FIFO_SIZE]; + if (options[APP_OPTIONS_HIGH_WATERMARK]) + props->high_watermark = options[APP_OPTIONS_HIGH_WATERMARK]; + if (options[APP_OPTIONS_LOW_WATERMARK]) + props->low_watermark = options[APP_OPTIONS_LOW_WATERMARK]; + if (options[APP_OPTIONS_PCT_FIRST_ALLOC]) + props->pct_first_alloc = options[APP_OPTIONS_PCT_FIRST_ALLOC]; props->segment_type = seg_type; /* Add app to lookup by api_client_index table */ @@ -690,8 +711,7 @@ application_alloc_worker_and_init (application_t * app, app_worker_t ** wrk) sm = segment_manager_alloc (); sm->app_wrk_index = app_wrk->wrk_index; - if ((rv = segment_manager_init (sm, app->sm_properties.segment_size, - app->sm_properties.prealloc_fifos))) + if ((rv = segment_manager_init (sm))) { app_worker_free (app_wrk); return rv; @@ -825,16 +845,21 @@ vnet_application_attach (vnet_app_attach_args_t * a) if (app) return VNET_API_ERROR_APP_ALREADY_ATTACHED; - if (a->api_client_index != APP_INVALID_INDEX) + /* Socket api sets the name and validates namespace prior to attach */ + if (!a->use_sock_api) { - app_name = app_name_from_api_index (a->api_client_index); - a->name = app_name; - } + if (a->api_client_index != APP_INVALID_INDEX) + { + app_name = app_name_from_api_index (a->api_client_index); + a->name = app_name; + } - secret = a->options[APP_OPTIONS_NAMESPACE_SECRET]; - if ((rv = app_validate_namespace (a->namespace_id, secret, &app_ns_index))) - return rv; - a->options[APP_OPTIONS_NAMESPACE] = app_ns_index; + secret = a->options[APP_OPTIONS_NAMESPACE_SECRET]; + if ((rv = + app_validate_namespace (a->namespace_id, secret, &app_ns_index))) + return rv; + a->options[APP_OPTIONS_NAMESPACE] = app_ns_index; + } if ((rv = application_alloc_and_init ((app_init_args_t *) a))) return rv; @@ -953,17 +978,17 @@ vnet_listen (vnet_listen_args_t * a) app = application_get_if_valid (a->app_index); if (!app) - return VNET_API_ERROR_APPLICATION_NOT_ATTACHED; + return SESSION_E_NOAPP; app_wrk = application_get_worker (app, a->wrk_map_index); if (!app_wrk) - return VNET_API_ERROR_INVALID_VALUE; + return SESSION_E_INVALID_APPWRK; a->sep_ext.app_wrk_index = app_wrk->wrk_index; session_endpoint_update_for_app (&a->sep_ext, app, 0 /* is_connect */ ); if (!session_endpoint_in_ns (&a->sep)) - return VNET_API_ERROR_INVALID_VALUE_2; + return SESSION_E_INVALID_NS; /* * Check if we already have an app listener @@ -972,9 +997,9 @@ vnet_listen (vnet_listen_args_t * a) if (app_listener) { if (app_listener->app_index != app->app_index) - return VNET_API_ERROR_ADDRESS_IN_USE; - if (app_worker_start_listen (app_wrk, app_listener)) - return -1; + return SESSION_E_ALREADY_LISTENING; + if ((rv = app_worker_start_listen (app_wrk, app_listener))) + return rv; a->handle = app_listener_handle (app_listener); return 0; } @@ -1004,7 +1029,7 @@ vnet_connect (vnet_connect_args_t * a) ASSERT (vlib_thread_is_main_w_barrier ()); if (session_endpoint_is_zero (&a->sep)) - return VNET_API_ERROR_INVALID_VALUE; + return SESSION_E_INVALID_RMT_IP; client = application_get (a->app_index); session_endpoint_update_for_app (&a->sep_ext, client, 1 /* is_connect */ ); @@ -1024,13 +1049,12 @@ vnet_connect (vnet_connect_args_t * a) rv = app_worker_connect_session (client_wrk, &a->sep, a->api_context); if (rv <= 0) return rv; + a->sep_ext.transport_proto = a->sep_ext.original_tp; } /* * Not connecting to a local server, propagate to transport */ - if (app_worker_connect_session (client_wrk, &a->sep, a->api_context)) - return VNET_API_ERROR_SESSION_CONNECT; - return 0; + return app_worker_connect_session (client_wrk, &a->sep, a->api_context); } int @@ -1043,22 +1067,22 @@ vnet_unlisten (vnet_unlisten_args_t * a) ASSERT (vlib_thread_is_main_w_barrier ()); if (!(app = application_get_if_valid (a->app_index))) - return VNET_API_ERROR_APPLICATION_NOT_ATTACHED; + return SESSION_E_NOAPP; if (!(al = app_listener_get_w_handle (a->handle))) - return -1; + return SESSION_E_NOLISTEN; if (al->app_index != app->app_index) { clib_warning ("app doesn't own handle %llu!", a->handle); - return -1; + return SESSION_E_OWNER; } app_wrk = application_get_worker (app, a->wrk_map_index); if (!app_wrk) { clib_warning ("no app %u worker %u", app->app_index, a->wrk_map_index); - return -1; + return SESSION_E_INVALID_APPWRK; } return app_worker_stop_listen (app_wrk, al); @@ -1072,10 +1096,11 @@ vnet_disconnect_session (vnet_disconnect_args_t * a) s = session_get_from_handle_if_valid (a->handle); if (!s) - return VNET_API_ERROR_INVALID_VALUE; + return SESSION_E_NOSESSION; + app_wrk = app_worker_get (s->app_wrk_index); if (app_wrk->app_index != a->app_index) - return VNET_API_ERROR_INVALID_VALUE; + return SESSION_E_OWNER; /* We're peeking into another's thread pool. Make sure */ ASSERT (s->session_index == session_index_from_handle (a->handle)); @@ -1090,9 +1115,10 @@ application_change_listener_owner (session_t * s, app_worker_t * app_wrk) app_worker_t *old_wrk = app_worker_get (s->app_wrk_index); app_listener_t *app_listener; application_t *app; + int rv; if (!old_wrk) - return -1; + return SESSION_E_INVALID_APPWRK; hash_unset (old_wrk->listeners_table, listen_session_get_handle (s)); if (session_transport_service_type (s) == TRANSPORT_SERVICE_CL @@ -1101,7 +1127,7 @@ application_change_listener_owner (session_t * s, app_worker_t * app_wrk) app = application_get (old_wrk->app_index); if (!app) - return -1; + return SESSION_E_NOAPP; app_listener = app_listener_get (app, s->al_index); @@ -1109,8 +1135,8 @@ application_change_listener_owner (session_t * s, app_worker_t * app_wrk) app_listener->workers = clib_bitmap_set (app_listener->workers, old_wrk->wrk_map_index, 0); - if (app_worker_start_listen (app_wrk, app_listener)) - return -1; + if ((rv = app_worker_start_listen (app_wrk, app_listener))) + return rv; s->app_wrk_index = app_wrk->wrk_index; @@ -1455,7 +1481,7 @@ format_application (u8 * s, va_list * args) props = application_segment_manager_properties (app); if (!verbose) { - s = format (s, "%-10u%-20v%-40s", app->app_index, app_name, + s = format (s, "%-10u%-20v%-40v", app->app_index, app_name, app_ns_name); return s; } @@ -1732,6 +1758,7 @@ application_init (vlib_main_t * vm) /* Add a certificate with index 0 to support legacy apis */ (void) app_cert_key_pair_alloc (); app_main.last_crypto_engine = CRYPTO_ENGINE_LAST; + app_main.app_by_name = hash_create_vec (0, sizeof (u8), sizeof (uword)); return 0; }