diff options
-rw-r--r-- | vnet/vnet/lisp-cp/control.c | 64 | ||||
-rw-r--r-- | vnet/vnet/lisp-cp/lisp_types.c | 4 | ||||
-rw-r--r-- | vnet/vnet/lisp-cp/lisp_types.h | 9 |
3 files changed, 66 insertions, 11 deletions
diff --git a/vnet/vnet/lisp-cp/control.c b/vnet/vnet/lisp-cp/control.c index 8b3d25f8dfa..1e3b98ff5c6 100644 --- a/vnet/vnet/lisp-cp/control.c +++ b/vnet/vnet/lisp-cp/control.c @@ -891,32 +891,74 @@ VLIB_CLI_COMMAND (lisp_pitr_set_locator_set_command) = { .function = lisp_pitr_set_locator_set_command_fn, }; + +static u8 * +format_eid_entry (u8 * s, va_list * args) +{ + vnet_main_t * vnm = va_arg (*args, vnet_main_t *); + lisp_cp_main_t * lcm = va_arg (*args, lisp_cp_main_t *); + gid_address_t * gid = va_arg (*args, gid_address_t *); + locator_set_t * ls = va_arg (*args, locator_set_t *); + u32 * loc_index; + u8 first_line = 1; + u8 * loc; + + u8 * type = ls->local ? format(0, "local(%s)", ls->name) + : format(0, "remote"); + + if (vec_len (ls->locator_indices) == 0) + { + s = format (s, "%-35U%-20s", format_gid_address, gid, type); + } + else + { + vec_foreach (loc_index, ls->locator_indices) + { + locator_t * l = pool_elt_at_index (lcm->locator_pool, loc_index[0]); + if (l->local) + loc = format (0, "%U", format_vnet_sw_if_index_name, vnm, + l->sw_if_index); + else + loc = format (0, "%U", format_ip_address, + &gid_address_ip (&l->address)); + + if (first_line) + { + s = format (s, "%-35U%-20s%-v\n", format_gid_address, + gid, type, loc); + first_line = 0; + } + else + s = format (s, "%55s%v\n", "", loc); + } + } + return s; +} + static clib_error_t * -lisp_show_local_eid_table_command_fn (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) +lisp_show_eid_table_command_fn (vlib_main_t * vm, + unformat_input_t * input, + vlib_cli_command_t * cmd) { lisp_cp_main_t * lcm = vnet_lisp_cp_get_main(); mapping_t * mapit; - vlib_cli_output (vm, "%=30s%=16s", "EID", "Locator"); + vlib_cli_output (vm, "%-35s%-20s%-s", "EID", "type", "locators"); pool_foreach (mapit, lcm->mapping_pool, ({ - u8 * msg = 0; locator_set_t * ls = pool_elt_at_index (lcm->locator_set_pool, mapit->locator_set_index); - vlib_cli_output (vm, "%-30U%16v", format_gid_address, &mapit->eid, - ls->name); - vec_free (msg); + vlib_cli_output (vm, "%U", format_eid_entry, lcm->vnet_main, + lcm, &mapit->eid, ls); })); return 0; } -VLIB_CLI_COMMAND (lisp_cp_show_local_eid_table_command) = { +VLIB_CLI_COMMAND (lisp_cp_show_eid_table_command) = { .path = "show lisp eid-table", - .short_help = "Shows local EID table", - .function = lisp_show_local_eid_table_command_fn, + .short_help = "Shows EID table", + .function = lisp_show_eid_table_command_fn, }; /* cleans locator to locator-set data and removes locators not part of diff --git a/vnet/vnet/lisp-cp/lisp_types.c b/vnet/vnet/lisp-cp/lisp_types.c index f0debc61a00..11e252aac54 100644 --- a/vnet/vnet/lisp-cp/lisp_types.c +++ b/vnet/vnet/lisp-cp/lisp_types.c @@ -160,6 +160,10 @@ format_gid_address (u8 * s, va_list * args) case GID_ADDR_IP_PREFIX: return format (s, "[%d] %U", gid_address_vni(a), format_ip_prefix, &gid_address_ippref(a)); + case GID_ADDR_SRC_DST: + return format (s, "[%d] %U|%U", gid_address_vni(a), + format_ip_prefix, &gid_address_sd_source_pref(a), + format_ip_prefix, &gid_address_sd_dest_pref(a)); default: clib_warning("Can't format gid type %d", type); return 0; diff --git a/vnet/vnet/lisp-cp/lisp_types.h b/vnet/vnet/lisp-cp/lisp_types.h index 235d4701d46..709d415deca 100644 --- a/vnet/vnet/lisp-cp/lisp_types.h +++ b/vnet/vnet/lisp-cp/lisp_types.h @@ -64,6 +64,7 @@ typedef enum GID_ADDR_IP_PREFIX, GID_ADDR_LCAF, GID_ADDR_MAC, + GID_ADDR_SRC_DST, GID_ADDR_NO_ADDRESS, GID_ADDR_TYPES } gid_address_type_t; @@ -87,6 +88,10 @@ typedef struct struct _gid_address_t *dst; } source_dest_t; +#define SD_CAST (source_dest_t *) +#define sd_dst_gid(_a) (SD_CAST _a)->dst +#define sd_src_gid(_a) (SD_CAST _a)->src + typedef struct { u8 vni_mask_len; @@ -172,6 +177,10 @@ u32 gid_address_parse (u8 * offset, gid_address_t *a); #define gid_address_mac(_a) (_a)->mac #define gid_address_vni(_a) (_a)->vni #define gid_address_vni_mask(_a) (_a)->vni_mask +#define gid_address_sd_dest_pref(_a) \ + gid_address_ippref(sd_dst_gid(_a)) +#define gid_address_sd_source_pref(_a) \ + gid_address_ippref(sd_src_gid(_a)) /* 'sub'address functions */ #define foreach_gid_address_type_fcns \ |