u8
session_endpoint_in_ns (session_endpoint_t * sep)
{
- u8 is_zero = ip_is_zero (&sep->ip, sep->is_ip4);
- if (!is_zero && sep->sw_if_index != ENDPOINT_INVALID_INDEX
+ u8 is_lep = session_endpoint_is_local (sep);
+ if (!is_lep && sep->sw_if_index != ENDPOINT_INVALID_INDEX
&& !ip_interface_has_address (sep->sw_if_index, &sep->ip, sep->is_ip4))
{
clib_warning ("sw_if_index %u not configured with ip %U",
sep->is_ip4);
return 0;
}
- return (is_zero || ip_is_local (sep->fib_index, &sep->ip, sep->is_ip4));
+ return (is_lep || ip_is_local (sep->fib_index, &sep->ip, sep->is_ip4));
}
int
* Add session endpoint to local session table. Only binds to "inaddr_any"
* (i.e., zero address) are added to local scope table.
*/
- if (application_has_local_scope (app) && session_endpoint_is_zero (sep))
+ if (application_has_local_scope (app) && session_endpoint_is_local (sep))
{
if ((rv = application_start_local_listen (app, sep, handle)))
return rv;
u64 secret;
int rv;
- app = application_lookup (a->api_client_index);
+ if (a->api_client_index != APP_INVALID_INDEX)
+ app = application_lookup (a->api_client_index);
+ else if (a->name)
+ app = application_lookup_name (a->name);
+ else
+ return clib_error_return_code (0, VNET_API_ERROR_INVALID_VALUE, 0,
+ "api index or name must be provided");
+
if (app)
- return clib_error_return_code (0, VNET_API_ERROR_APP_ALREADY_ATTACHED,
- 0, "app already attached");
+ return clib_error_return_code (0, VNET_API_ERROR_APP_ALREADY_ATTACHED, 0,
+ "app already attached");
secret = a->options[APP_OPTIONS_NAMESPACE_SECRET];
if ((rv = session_validate_namespace (a->namespace_id, secret,
return clib_error_return_code (0, rv, 0, "namespace validation: %d", rv);
a->options[APP_OPTIONS_NAMESPACE] = app_ns_index;
app = application_new ();
- if ((rv = application_init (app, a->api_client_index, a->options,
+ if ((rv = application_init (app, a->api_client_index, a->name, a->options,
a->session_cb_vft)))
return clib_error_return_code (0, rv, 0, "app init: %d", rv);
- a->app_event_queue_address = pointer_to_uword (app->event_queue);
+ a->app_evt_q = app->event_queue;
sm = segment_manager_get (app->first_segment_manager);
fs = segment_manager_get_segment_w_lock (sm, 0);
{
session_endpoint_extended_t sep = SESSION_ENDPOINT_EXT_NULL;
stream_session_t *listener;
+ u32 table_index;
int rv;
rv = parse_uri (a->uri, &sep);
if (rv)
return rv;
- /* NOTE: only default table supported for uri */
- listener = session_lookup_listener (0, (session_endpoint_t *) & sep);
+ /* NOTE: only default fib tables supported for uri apis */
+ table_index = session_lookup_get_index_for_fib (fib_ip_proto (!sep.is_ip4),
+ 0);
+ listener = session_lookup_listener (table_index,
+ (session_endpoint_t *) & sep);
if (!listener)
return VNET_API_ERROR_ADDRESS_NOT_IN_USE;
if (session_handle_is_local (a->handle))
{
local_session_t *ls;
- ls = application_get_local_session_from_handle (a->handle);
+
+ /* Disconnect reply came to worker 1 not main thread */
+ if (vlib_get_thread_index () == 1)
+ {
+ vlib_rpc_call_main_thread (vnet_disconnect_session, (u8 *) a,
+ sizeof (*a));
+ return 0;
+ }
+
+ if (!(ls = application_get_local_session_from_handle (a->handle)))
+ return 0;
+
if (ls->app_index != a->app_index && ls->client_index != a->app_index)
{
clib_warning ("app %u is neither client nor server for session %u",
{
int rv;
if ((rv = vnet_bind_i (a->app_index, &a->sep, &a->handle)))
- return clib_error_return_code (0, rv, 0, "bind failed");
+ return clib_error_return_code (0, rv, 0, "bind failed: %d", rv);
return 0;
}
{
int rv;
if ((rv = vnet_unbind_i (a->app_index, a->handle)))
- return clib_error_return_code (0, rv, 0, "unbind failed");
+ return clib_error_return_code (0, rv, 0, "unbind failed: %d", rv);
return 0;
}
int rv;
if ((rv = application_connect (a->app_index, a->api_context, sep)))
- return clib_error_return_code (0, rv, 0, "connect failed");
+ return clib_error_return_code (0, rv, 0, "connect failed: %d", rv);
return 0;
}