blob: cd2636cff32679e3402e1136a2ba2dc8c16bf065 [file] [log] [blame]
Florin Corascea194d2017-10-02 00:18:51 -07001/*
Florin Coras288eaab2019-02-03 15:26:14 -08002 * Copyright (c) 2017-2019 Cisco and/or its affiliates.
Florin Corascea194d2017-10-02 00:18:51 -07003 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include <vnet/session/application_namespace.h>
Florin Coras61ae0562020-09-02 19:10:28 -070017#include <vnet/session/application.h>
Florin Corascea194d2017-10-02 00:18:51 -070018#include <vnet/session/session_table.h>
19#include <vnet/session/session.h>
20#include <vnet/fib/fib_table.h>
Florin Coras61ae0562020-09-02 19:10:28 -070021#include <vppinfra/file.h>
Nathan Skrzypczak3d5e7412021-09-17 11:53:25 +020022#include <vppinfra/format_table.h>
Florin Coras61ae0562020-09-02 19:10:28 -070023#include <vlib/unix/unix.h>
Florin Corascea194d2017-10-02 00:18:51 -070024
25/**
26 * Hash table of application namespaces by app ns ids
27 */
28uword *app_namespace_lookup_table;
29
30/**
31 * Pool of application namespaces
32 */
33static app_namespace_t *app_namespace_pool;
34
Florin Coras61ae0562020-09-02 19:10:28 -070035static u8 app_sapi_enabled;
36
Florin Corascea194d2017-10-02 00:18:51 -070037app_namespace_t *
38app_namespace_get (u32 index)
39{
40 return pool_elt_at_index (app_namespace_pool, index);
41}
42
43app_namespace_t *
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +020044app_namespace_get_from_id (const u8 *ns_id)
Florin Corascea194d2017-10-02 00:18:51 -070045{
46 u32 index = app_namespace_index_from_id (ns_id);
47 if (index == APP_NAMESPACE_INVALID_INDEX)
48 return 0;
49 return app_namespace_get (index);
50}
51
52u32
53app_namespace_index (app_namespace_t * app_ns)
54{
55 return (app_ns - app_namespace_pool);
56}
57
Nathan Skrzypczakb3ea73e2021-08-05 10:22:52 +020058void
59app_namespace_free (app_namespace_t *app_ns)
60{
61 hash_unset_mem (app_namespace_lookup_table, app_ns->ns_id);
62 vec_free (app_ns->ns_id);
63
64 pool_put (app_namespace_pool, app_ns);
65}
66
Florin Corascea194d2017-10-02 00:18:51 -070067app_namespace_t *
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +020068app_namespace_alloc (const u8 *ns_id)
Florin Corascea194d2017-10-02 00:18:51 -070069{
70 app_namespace_t *app_ns;
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +020071
Florin Corascea194d2017-10-02 00:18:51 -070072 pool_get (app_namespace_pool, app_ns);
Dave Barachb7b92992018-10-17 10:38:51 -040073 clib_memset (app_ns, 0, sizeof (*app_ns));
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +020074
75 app_ns->ns_id = vec_dup ((u8 *) ns_id);
76 vec_terminate_c_string (app_ns->ns_id);
77
Florin Corascea194d2017-10-02 00:18:51 -070078 hash_set_mem (app_namespace_lookup_table, app_ns->ns_id,
79 app_ns - app_namespace_pool);
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +020080
Florin Corascea194d2017-10-02 00:18:51 -070081 return app_ns;
82}
83
Florin Corasc1a42652019-02-08 18:27:29 -080084int
Florin Corascea194d2017-10-02 00:18:51 -070085vnet_app_namespace_add_del (vnet_app_namespace_add_del_args_t * a)
86{
87 app_namespace_t *app_ns;
88 session_table_t *st;
Nathan Skrzypczakb3ea73e2021-08-05 10:22:52 +020089 u32 ns_index;
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +020090 int rv;
Florin Corascea194d2017-10-02 00:18:51 -070091
92 if (a->is_add)
93 {
94 if (a->sw_if_index != APP_NAMESPACE_INVALID_INDEX
Dave Barach3940de32019-07-23 16:28:36 -040095 && !vnet_get_sw_interface_or_null (vnet_get_main (),
96 a->sw_if_index))
Florin Corasc1a42652019-02-08 18:27:29 -080097 return VNET_API_ERROR_INVALID_SW_IF_INDEX;
98
Florin Corascea194d2017-10-02 00:18:51 -070099
100 if (a->sw_if_index != APP_NAMESPACE_INVALID_INDEX)
101 {
102 a->ip4_fib_id =
103 fib_table_get_table_id_for_sw_if_index (FIB_PROTOCOL_IP4,
104 a->sw_if_index);
105 a->ip6_fib_id =
Florin Coras56b39f62018-03-27 17:29:32 -0700106 fib_table_get_table_id_for_sw_if_index (FIB_PROTOCOL_IP6,
Florin Corascea194d2017-10-02 00:18:51 -0700107 a->sw_if_index);
108 }
109 if (a->sw_if_index == APP_NAMESPACE_INVALID_INDEX
110 && a->ip4_fib_id == APP_NAMESPACE_INVALID_INDEX)
Florin Corasc1a42652019-02-08 18:27:29 -0800111 return VNET_API_ERROR_INVALID_VALUE;
112
Florin Corascea194d2017-10-02 00:18:51 -0700113 app_ns = app_namespace_get_from_id (a->ns_id);
114 if (!app_ns)
Florin Corasfc1c6122017-10-26 14:25:12 -0700115 {
116 app_ns = app_namespace_alloc (a->ns_id);
117 st = session_table_alloc ();
Florin Coras6c36f532017-11-03 18:32:34 -0700118 session_table_init (st, FIB_PROTOCOL_MAX);
119 st->is_local = 1;
120 st->appns_index = app_namespace_index (app_ns);
Florin Corasfc1c6122017-10-26 14:25:12 -0700121 app_ns->local_table_index = session_table_index (st);
Nathan Skrzypczakb3ea73e2021-08-05 10:22:52 +0200122 if (a->netns)
123 {
124 app_ns->netns = vec_dup (a->netns);
125 vec_terminate_c_string (app_ns->netns);
126 }
127 if (a->sock_name)
128 {
129 app_ns->sock_name = vec_dup (a->sock_name);
130 vec_terminate_c_string (app_ns->sock_name);
131 }
132
133 /* Add socket for namespace,
134 * only at creation time */
135 if (app_sapi_enabled)
136 {
137 rv = appns_sapi_add_ns_socket (app_ns);
138 if (rv)
139 return rv;
140 }
Florin Corasfc1c6122017-10-26 14:25:12 -0700141 }
Nathan Skrzypczakb3ea73e2021-08-05 10:22:52 +0200142
Florin Corascea194d2017-10-02 00:18:51 -0700143 app_ns->ns_secret = a->secret;
144 app_ns->sw_if_index = a->sw_if_index;
Florin Corascea194d2017-10-02 00:18:51 -0700145 app_ns->ip4_fib_index =
146 fib_table_find (FIB_PROTOCOL_IP4, a->ip4_fib_id);
147 app_ns->ip6_fib_index =
148 fib_table_find (FIB_PROTOCOL_IP6, a->ip6_fib_id);
Florin Coras6c36f532017-11-03 18:32:34 -0700149 session_lookup_set_tables_appns (app_ns);
Florin Coras61ae0562020-09-02 19:10:28 -0700150
Florin Corascea194d2017-10-02 00:18:51 -0700151 }
152 else
153 {
Nathan Skrzypczakb3ea73e2021-08-05 10:22:52 +0200154 ns_index = app_namespace_index_from_id (a->ns_id);
155 if (ns_index == APP_NAMESPACE_INVALID_INDEX)
156 return VNET_API_ERROR_INVALID_VALUE;
157
158 app_ns = app_namespace_get (ns_index);
159 if (!app_ns)
160 return VNET_API_ERROR_INVALID_VALUE;
161
162 application_namespace_cleanup (app_ns);
163
164 if (app_sapi_enabled)
165 appns_sapi_del_ns_socket (app_ns);
166
167 st = session_table_get (app_ns->local_table_index);
168
169 session_table_free (st, FIB_PROTOCOL_MAX);
170 if (app_ns->netns)
171 vec_free (app_ns->netns);
172 if (app_ns->sock_name)
173 vec_free (app_ns->sock_name);
174
175 app_namespace_free (app_ns);
Florin Corascea194d2017-10-02 00:18:51 -0700176 }
Nathan Skrzypczakb3ea73e2021-08-05 10:22:52 +0200177
Florin Corascea194d2017-10-02 00:18:51 -0700178 return 0;
179}
180
181const u8 *
182app_namespace_id (app_namespace_t * app_ns)
183{
184 return app_ns->ns_id;
185}
186
187u32
188app_namespace_index_from_id (const u8 * ns_id)
189{
190 uword *indexp;
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200191 u8 *key;
192
193 key = vec_dup ((u8 *) ns_id);
194 vec_terminate_c_string (key);
195
196 indexp = hash_get_mem (app_namespace_lookup_table, key);
197 vec_free (key);
Florin Corascea194d2017-10-02 00:18:51 -0700198 if (!indexp)
199 return APP_NAMESPACE_INVALID_INDEX;
200 return *indexp;
201}
202
203const u8 *
204app_namespace_id_from_index (u32 index)
205{
206 app_namespace_t *app_ns;
207
208 app_ns = app_namespace_get (index);
209 return app_namespace_id (app_ns);
210}
211
Florin Coras1c710452017-10-17 00:03:13 -0700212u32
213app_namespace_get_fib_index (app_namespace_t * app_ns, u8 fib_proto)
214{
215 return fib_proto == FIB_PROTOCOL_IP4 ?
216 app_ns->ip4_fib_index : app_ns->ip6_fib_index;
217}
218
219session_table_t *
220app_namespace_get_local_table (app_namespace_t * app_ns)
221{
222 return session_table_get (app_ns->local_table_index);
223}
224
Nathan Skrzypczak7b3a3df2021-07-28 14:09:50 +0200225int
226appns_sapi_enable_disable (int is_enable)
Florin Coras61ae0562020-09-02 19:10:28 -0700227{
Nathan Skrzypczak7b3a3df2021-07-28 14:09:50 +0200228 /* This cannot be called with active sockets */
229 if (pool_elts (app_namespace_pool))
230 return -1;
231
232 app_sapi_enabled = is_enable;
233 return 0;
Florin Coras61ae0562020-09-02 19:10:28 -0700234}
235
236u8
237appns_sapi_enabled (void)
238{
239 return app_sapi_enabled;
240}
241
242void
Florin Corascea194d2017-10-02 00:18:51 -0700243app_namespaces_init (void)
244{
245 u8 *ns_id = format (0, "default");
Florin Corasfc1c6122017-10-26 14:25:12 -0700246
247 if (!app_namespace_lookup_table)
248 app_namespace_lookup_table =
249 hash_create_vec (0, sizeof (u8), sizeof (uword));
Florin Corascea194d2017-10-02 00:18:51 -0700250
251 /*
252 * Allocate default namespace
253 */
Florin Coras7cb471a2021-07-23 08:39:26 -0700254
255 /* clang-format off */
Florin Corascea194d2017-10-02 00:18:51 -0700256 vnet_app_namespace_add_del_args_t a = {
257 .ns_id = ns_id,
Florin Coras7cb471a2021-07-23 08:39:26 -0700258 .netns = 0,
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200259 .sock_name = 0,
Florin Corascea194d2017-10-02 00:18:51 -0700260 .secret = 0,
261 .sw_if_index = APP_NAMESPACE_INVALID_INDEX,
262 .is_add = 1
263 };
Florin Coras7cb471a2021-07-23 08:39:26 -0700264 /* clang-format on */
265
Florin Corascea194d2017-10-02 00:18:51 -0700266 vnet_app_namespace_add_del (&a);
267 vec_free (ns_id);
268}
269
270static clib_error_t *
271app_ns_fn (vlib_main_t * vm, unformat_input_t * input,
272 vlib_cli_command_t * cmd)
273{
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200274 u8 is_add = 0, *ns_id = 0, secret_set = 0, sw_if_index_set = 0;
275 u8 *netns = 0, *sock_name = 0;
Dave Wallace8af20542017-10-26 03:29:30 -0400276 unformat_input_t _line_input, *line_input = &_line_input;
Florin Corascea194d2017-10-02 00:18:51 -0700277 u32 sw_if_index, fib_id = APP_NAMESPACE_INVALID_INDEX;
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200278 vnet_main_t *vnm = vnet_get_main ();
Florin Corascea194d2017-10-02 00:18:51 -0700279 u64 secret;
280 clib_error_t *error = 0;
Florin Corasc1a42652019-02-08 18:27:29 -0800281 int rv;
Florin Corascea194d2017-10-02 00:18:51 -0700282
283 session_cli_return_if_not_enabled ();
284
Dave Wallace8af20542017-10-26 03:29:30 -0400285 if (!unformat_user (input, unformat_line_input, line_input))
286 return 0;
287
288 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
Florin Corascea194d2017-10-02 00:18:51 -0700289 {
Dave Wallace8af20542017-10-26 03:29:30 -0400290 if (unformat (line_input, "add"))
Florin Corascea194d2017-10-02 00:18:51 -0700291 is_add = 1;
Nathan Skrzypczakb3ea73e2021-08-05 10:22:52 +0200292 else if (unformat (line_input, "del"))
293 is_add = 0;
Dave Wallace8af20542017-10-26 03:29:30 -0400294 else if (unformat (line_input, "id %_%v%_", &ns_id))
Florin Corascea194d2017-10-02 00:18:51 -0700295 ;
Dave Wallace8af20542017-10-26 03:29:30 -0400296 else if (unformat (line_input, "secret %lu", &secret))
Florin Corascea194d2017-10-02 00:18:51 -0700297 secret_set = 1;
Dave Wallace8af20542017-10-26 03:29:30 -0400298 else if (unformat (line_input, "sw_if_index %u", &sw_if_index))
Florin Corascea194d2017-10-02 00:18:51 -0700299 sw_if_index_set = 1;
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200300 else if (unformat (line_input, "if %U", unformat_vnet_sw_interface, vnm,
301 &sw_if_index))
302 sw_if_index_set = 1;
Dave Wallace8af20542017-10-26 03:29:30 -0400303 else if (unformat (line_input, "fib_id", &fib_id))
Florin Corascea194d2017-10-02 00:18:51 -0700304 ;
Florin Coras7cb471a2021-07-23 08:39:26 -0700305 else if (unformat (line_input, "netns %_%v%_", &netns))
306 ;
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200307 else if (unformat (line_input, "sock-name %_%v%_", &sock_name))
308 ;
Florin Corascea194d2017-10-02 00:18:51 -0700309 else
Dave Wallace8af20542017-10-26 03:29:30 -0400310 {
311 error = clib_error_return (0, "unknown input `%U'",
312 format_unformat_error, line_input);
Florin Coras7cb471a2021-07-23 08:39:26 -0700313 goto done;
Dave Wallace8af20542017-10-26 03:29:30 -0400314 }
Florin Corascea194d2017-10-02 00:18:51 -0700315 }
316
Nathan Skrzypczakb3ea73e2021-08-05 10:22:52 +0200317 if (!ns_id)
Florin Corascea194d2017-10-02 00:18:51 -0700318 {
Nathan Skrzypczakb3ea73e2021-08-05 10:22:52 +0200319 vlib_cli_output (vm, "namespace-id must be provided");
Florin Coras7cb471a2021-07-23 08:39:26 -0700320 goto done;
Florin Corascea194d2017-10-02 00:18:51 -0700321 }
322
Nathan Skrzypczakb3ea73e2021-08-05 10:22:52 +0200323 if (is_add && (!secret_set || !sw_if_index_set))
Florin Corascea194d2017-10-02 00:18:51 -0700324 {
Nathan Skrzypczakb3ea73e2021-08-05 10:22:52 +0200325 vlib_cli_output (vm, "secret and interface must be provided");
326 goto done;
Florin Corascea194d2017-10-02 00:18:51 -0700327 }
328
Nathan Skrzypczakb3ea73e2021-08-05 10:22:52 +0200329 /* clang-format off */
330 vnet_app_namespace_add_del_args_t args = {
331 .ns_id = ns_id,
332 .netns = netns,
333 .secret = secret,
334 .sw_if_index = sw_if_index,
335 .sock_name = sock_name,
336 .ip4_fib_id = fib_id,
337 .is_add = is_add,
338 };
339 /* clang-format on */
340
341 if ((rv = vnet_app_namespace_add_del (&args)))
342 error = clib_error_return (0, "app namespace add del returned %d", rv);
343
Florin Coras7cb471a2021-07-23 08:39:26 -0700344done:
345
346 vec_free (ns_id);
347 vec_free (netns);
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200348 vec_free (sock_name);
Florin Coras7cb471a2021-07-23 08:39:26 -0700349 unformat_free (line_input);
350
Florin Corascea194d2017-10-02 00:18:51 -0700351 return error;
352}
353
354/* *INDENT-OFF* */
Florin Coras7cb471a2021-07-23 08:39:26 -0700355VLIB_CLI_COMMAND (app_ns_command, static) = {
Florin Corascea194d2017-10-02 00:18:51 -0700356 .path = "app ns",
Nathan Skrzypczakb3ea73e2021-08-05 10:22:52 +0200357 .short_help = "app ns [add|del] id <namespace-id> secret <secret> "
358 "sw_if_index <sw_if_index> if <interface> [netns <ns>]",
Florin Corascea194d2017-10-02 00:18:51 -0700359 .function = app_ns_fn,
360};
361/* *INDENT-ON* */
362
363u8 *
364format_app_namespace (u8 * s, va_list * args)
365{
366 app_namespace_t *app_ns = va_arg (*args, app_namespace_t *);
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200367 vnet_main_t *vnm = vnet_get_main ();
Florin Coras7cb471a2021-07-23 08:39:26 -0700368
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200369 s = format (s, "Application namespace [%u]\nid: %s\nsecret: %lu",
370 app_namespace_index (app_ns), app_ns->ns_id, app_ns->ns_secret);
371 if (app_ns->sw_if_index != (u32) ~0)
372 s = format (s, "\nInterface: %U", format_vnet_sw_if_index_name, vnm,
373 app_ns->sw_if_index);
374 if (app_ns->netns)
375 s = format (s, "\nNetns: %s", app_ns->netns);
376 if (app_ns->sock_name)
377 s = format (s, "\nSocket: %s", app_ns->sock_name);
378
Florin Corascea194d2017-10-02 00:18:51 -0700379 return s;
380}
381
Florin Coras61ae0562020-09-02 19:10:28 -0700382static void
383app_namespace_show_api (vlib_main_t * vm, app_namespace_t * app_ns)
384{
385 app_ns_api_handle_t *handle;
386 app_worker_t *app_wrk;
387 clib_socket_t *cs;
388 clib_file_t *cf;
389
390 if (!app_sapi_enabled)
391 {
392 vlib_cli_output (vm, "app socket api not enabled!");
393 return;
394 }
395
396 vlib_cli_output (vm, "socket: %v\n", app_ns->sock_name);
397
398 if (!pool_elts (app_ns->app_sockets))
399 return;
400
401 vlib_cli_output (vm, "%12s%12s%5s", "app index", "wrk index", "fd");
402
403
404 /* *INDENT-OFF* */
Damjan Marionb2c31b62020-12-13 21:47:40 +0100405 pool_foreach (cs, app_ns->app_sockets) {
Florin Coras61ae0562020-09-02 19:10:28 -0700406 handle = (app_ns_api_handle_t *) &cs->private_data;
407 cf = clib_file_get (&file_main, handle->aah_file_index);
408 if (handle->aah_app_wrk_index == APP_INVALID_INDEX)
409 {
410 vlib_cli_output (vm, "%12d%12d%5u", -1, -1, cf->file_descriptor);
411 continue;
412 }
413 app_wrk = app_worker_get (handle->aah_app_wrk_index);
414 vlib_cli_output (vm, "%12d%12d%5u", app_wrk->app_index,
415 app_wrk->wrk_map_index, cf->file_descriptor);
Damjan Marionb2c31b62020-12-13 21:47:40 +0100416 }
Florin Coras61ae0562020-09-02 19:10:28 -0700417 /* *INDENT-ON* */
418}
419
Florin Corascea194d2017-10-02 00:18:51 -0700420static clib_error_t *
Florin Corasdcdff6e2017-11-07 22:36:02 -0800421show_app_ns_fn (vlib_main_t * vm, unformat_input_t * main_input,
Florin Corascea194d2017-10-02 00:18:51 -0700422 vlib_cli_command_t * cmd)
423{
Florin Corasdcdff6e2017-11-07 22:36:02 -0800424 unformat_input_t _line_input, *line_input = &_line_input;
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200425 u8 *ns_id = 0, do_table = 0, had_input = 1, do_api = 0;
Florin Corascea194d2017-10-02 00:18:51 -0700426 app_namespace_t *app_ns;
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200427 vnet_main_t *vnm = vnet_get_main ();
Florin Corascea194d2017-10-02 00:18:51 -0700428 session_table_t *st;
Nathan Skrzypczak3d5e7412021-09-17 11:53:25 +0200429 table_t table = {}, *t = &table;
Florin Corascea194d2017-10-02 00:18:51 -0700430
431 session_cli_return_if_not_enabled ();
432
Florin Corasdcdff6e2017-11-07 22:36:02 -0800433 if (!unformat_user (main_input, unformat_line_input, line_input))
Florin Coras26408082017-11-09 02:06:07 -0800434 {
435 had_input = 0;
436 goto do_ns_list;
437 }
Florin Corasdcdff6e2017-11-07 22:36:02 -0800438
439 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
Florin Corascea194d2017-10-02 00:18:51 -0700440 {
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200441 if (unformat (line_input, "id %_%v%_", &ns_id))
Florin Corascea194d2017-10-02 00:18:51 -0700442 do_table = 1;
Florin Coras61ae0562020-09-02 19:10:28 -0700443 else if (unformat (line_input, "api-clients"))
444 do_api = 1;
Florin Corascea194d2017-10-02 00:18:51 -0700445 else
Dave Wallace8af20542017-10-26 03:29:30 -0400446 {
Florin Corasdcdff6e2017-11-07 22:36:02 -0800447 vlib_cli_output (vm, "unknown input [%U]", format_unformat_error,
448 line_input);
449 goto done;
Dave Wallace8af20542017-10-26 03:29:30 -0400450 }
Florin Corascea194d2017-10-02 00:18:51 -0700451 }
452
Florin Coras61ae0562020-09-02 19:10:28 -0700453 if (do_api)
454 {
455 if (!do_table)
456 {
457 vlib_cli_output (vm, "must specify a table for api");
458 goto done;
459 }
460 app_ns = app_namespace_get_from_id (ns_id);
461 app_namespace_show_api (vm, app_ns);
462 goto done;
463 }
Florin Corascea194d2017-10-02 00:18:51 -0700464 if (do_table)
465 {
466 app_ns = app_namespace_get_from_id (ns_id);
467 if (!app_ns)
468 {
469 vlib_cli_output (vm, "ns %v not found", ns_id);
Florin Corasdcdff6e2017-11-07 22:36:02 -0800470 goto done;
Florin Corascea194d2017-10-02 00:18:51 -0700471 }
472 st = session_table_get (app_ns->local_table_index);
473 if (!st)
474 {
475 vlib_cli_output (vm, "table for ns %v could not be found", ns_id);
Florin Corasdcdff6e2017-11-07 22:36:02 -0800476 goto done;
Florin Corascea194d2017-10-02 00:18:51 -0700477 }
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200478 vlib_cli_output (vm, "%U", format_app_namespace, app_ns);
Florin Corascea194d2017-10-02 00:18:51 -0700479 session_lookup_show_table_entries (vm, st, 0, 1);
480 vec_free (ns_id);
Florin Corasdcdff6e2017-11-07 22:36:02 -0800481 goto done;
Florin Corascea194d2017-10-02 00:18:51 -0700482 }
483
Florin Coras26408082017-11-09 02:06:07 -0800484do_ns_list:
Nathan Skrzypczak3d5e7412021-09-17 11:53:25 +0200485 table_add_header_col (t, 6, "Index", "Secret", "Interface", "Id", "Netns",
486 "Socket");
487 int i = 0;
488 pool_foreach (app_ns, app_namespace_pool)
489 {
490 int j = 0;
491 table_format_cell (t, i, j++, "%u", app_namespace_index (app_ns));
492 table_format_cell (t, i, j++, "%lu", app_ns->ns_secret);
493 table_format_cell (t, i, j++, "%U", format_vnet_sw_if_index_name, vnm,
494 app_ns->sw_if_index);
495 table_format_cell (t, i, j++, "%s", app_ns->ns_id);
496 table_format_cell (t, i, j++, "%s", app_ns->netns);
497 table_format_cell (t, i++, j++, "%s", app_ns->sock_name);
498 }
Florin Corasdff48db2017-11-19 18:06:58 -0800499
Nathan Skrzypczak3d5e7412021-09-17 11:53:25 +0200500 t->default_body.align = TTAA_LEFT;
501 t->default_header_col.align = TTAA_LEFT;
502 t->default_header_col.fg_color = TTAC_YELLOW;
503 t->default_header_col.flags = TTAF_FG_COLOR_SET;
504 vlib_cli_output (vm, "%U", format_table, t);
505 table_free (t);
Florin Corascea194d2017-10-02 00:18:51 -0700506
Florin Corasdcdff6e2017-11-07 22:36:02 -0800507done:
Florin Coras26408082017-11-09 02:06:07 -0800508 if (had_input)
509 unformat_free (line_input);
Florin Corascea194d2017-10-02 00:18:51 -0700510 return 0;
511}
512
513/* *INDENT-OFF* */
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200514VLIB_CLI_COMMAND (show_app_ns_command, static) = {
Florin Corascea194d2017-10-02 00:18:51 -0700515 .path = "show app ns",
Nathan Skrzypczak1a9e2f92021-07-28 19:35:08 +0200516 .short_help = "show app ns [id <id> [api-clients]]",
Florin Corascea194d2017-10-02 00:18:51 -0700517 .function = show_app_ns_fn,
518};
519/* *INDENT-ON* */
520
521/*
522 * fd.io coding-style-patch-verification: ON
523 *
524 * Local Variables:
525 * eval: (c-set-style "gnu")
526 * End:
527 */