};
/* *INDENT-ON* */
+static clib_error_t *
+lisp_add_del_ndp_entry_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ unformat_input_t _line_input, *line_input = &_line_input;
+ clib_error_t *error = NULL;
+ int rc = 0;
+ u8 hw_addr[6], bd = 0;
+ ip6_address_t ip6;
+ u32 hw_addr_set = 0, ip_set = 0, is_add = 1;
+ gid_address_t _g, *g = &_g;
+
+ memset (&ip6, 0, sizeof (ip6));
+ memset (hw_addr, 0, sizeof (hw_addr));
+ memset (g, 0, sizeof (*g));
+
+ if (!unformat_user (input, unformat_line_input, line_input))
+ return 0;
+
+ while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (line_input, "mac %U", unformat_mac_address, hw_addr))
+ hw_addr_set = 1;
+ else if (unformat (line_input, "ip %U", unformat_ip6_address, &ip6))
+ ip_set = 1;
+ else if (unformat (line_input, "del"))
+ is_add = 0;
+ else if (unformat (line_input, "bd %d", &bd))
+ ;
+ else
+ {
+ error = clib_error_return (0, "parse error");
+ goto done;
+ }
+ }
+
+ if (!ip_set || (!hw_addr_set && is_add))
+ {
+ vlib_cli_output (vm, "expected IP and MAC addresses!");
+ return 0;
+ }
+
+ /* build GID address */
+ ip_address_set (&gid_address_arp_ndp_ip (g), &ip6, IP6);
+ gid_address_ndp_bd (g) = bd;
+ gid_address_type (g) = GID_ADDR_NDP;
+ rc = vnet_lisp_add_del_l2_arp_ndp_entry (g, hw_addr, is_add);
+ if (rc)
+ clib_warning ("Failed to %s ndp entry!", is_add ? "add" : "delete");
+
+done:
+ unformat_free (line_input);
+ return error;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_add_del_ndp_entry_command) = {
+ .path = "one ndp",
+ .short_help = "one ndp [del] bd <bd> mac <mac> ip <ipv6>",
+ .function = lisp_add_del_ndp_entry_command_fn,
+};
+/* *INDENT-ON* */
+
+static clib_error_t *
+lisp_add_del_l2_arp_entry_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ unformat_input_t _line_input, *line_input = &_line_input;
+ clib_error_t *error = NULL;
+ int rc = 0;
+ u8 hw_addr[6], bd = 0;
+ ip4_address_t ip4;
+ u32 hw_addr_set = 0, ip_set = 0, is_add = 1;
+ gid_address_t _arp, *arp = &_arp;
+
+ memset (&ip4, 0, sizeof (ip4));
+ memset (hw_addr, 0, sizeof (hw_addr));
+ memset (arp, 0, sizeof (*arp));
+
+ if (!unformat_user (input, unformat_line_input, line_input))
+ return 0;
+
+ while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (line_input, "mac %U", unformat_mac_address, hw_addr))
+ hw_addr_set = 1;
+ else if (unformat (line_input, "ip %U", unformat_ip4_address, &ip4))
+ ip_set = 1;
+ else if (unformat (line_input, "del"))
+ is_add = 0;
+ else if (unformat (line_input, "bd %d", &bd))
+ ;
+ else
+ {
+ error = clib_error_return (0, "parse error");
+ goto done;
+ }
+ }
+
+ if (!ip_set || (!hw_addr_set && is_add))
+ {
+ vlib_cli_output (vm, "expected IP and MAC addresses!");
+ return 0;
+ }
+
+ /* build GID address */
+ gid_address_arp_ip4 (arp) = ip4;
+ gid_address_arp_bd (arp) = bd;
+ gid_address_type (arp) = GID_ADDR_ARP;
+ rc = vnet_lisp_add_del_l2_arp_ndp_entry (arp, hw_addr, is_add);
+ if (rc)
+ clib_warning ("Failed to %s l2 arp entry!", is_add ? "add" : "delete");
+
+done:
+ unformat_free (line_input);
+ return error;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_add_del_l2_arp_entry_command) = {
+ .path = "one l2 arp",
+ .short_help = "one l2 arp [del] bd <bd> mac <mac> ip <ipv4>",
+ .function = lisp_add_del_l2_arp_entry_command_fn,
+};
+/* *INDENT-ON* */
+
+static clib_error_t *
+lisp_show_l2_arp_entries_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ u32 *ht = vnet_lisp_l2_arp_bds_get ();
+ lisp_api_l2_arp_entry_t *entries, *e;
+ hash_pair_t *p;
+
+ /* *INDENT-OFF* */
+ hash_foreach_pair (p, ht,
+ ({
+ entries = vnet_lisp_l2_arp_entries_get_by_bd (p->key);
+ vlib_cli_output (vm, "Table: %d", p->key);
+
+ vec_foreach (e, entries)
+ {
+ vlib_cli_output (vm, "\t%U -> %U", format_ip4_address, &e->ip4,
+ format_mac_address, e->mac);
+ }
+ vec_free (entries);
+ }));
+ /* *INDENT-ON* */
+
+ hash_free (ht);
+ return 0;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_show_l2_arp_entries_command) = {
+ .path = "show one l2 arp entries",
+ .short_help = "Show ONE L2 ARP entries",
+ .function = lisp_show_l2_arp_entries_command_fn,
+};
+/* *INDENT-ON* */
+
+static clib_error_t *
+lisp_show_ndp_entries_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ u32 *ht = vnet_lisp_ndp_bds_get ();
+ lisp_api_ndp_entry_t *entries, *e;
+ hash_pair_t *p;
+
+ /* *INDENT-OFF* */
+ hash_foreach_pair (p, ht,
+ ({
+ entries = vnet_lisp_ndp_entries_get_by_bd (p->key);
+ vlib_cli_output (vm, "Table: %d", p->key);
+
+ vec_foreach (e, entries)
+ {
+ vlib_cli_output (vm, "\t%U -> %U", format_ip6_address, &e->ip6,
+ format_mac_address, e->mac);
+ }
+ vec_free (entries);
+ }));
+ /* *INDENT-ON* */
+
+ hash_free (ht);
+ return 0;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_show_ndp_entries_command) = {
+ .path = "show one ndp entries",
+ .short_help = "Show ONE NDP entries",
+ .function = lisp_show_ndp_entries_command_fn,
+};
+/* *INDENT-ON* */
+
/**
* Handler for add/del remote mapping CLI.
*
}
}
- if (!eid_set)
+ if (!del_all && !eid_set)
{
clib_warning ("missing eid!");
goto done;
goto done;
}
- /* TODO build src/dst with seid */
-
/* if it's a delete, clean forwarding */
if (!is_add)
{
/* add as static remote mapping, i.e., not authoritative and infinite
* ttl */
- rv = vnet_lisp_add_del_mapping (&eid, rlocs, action, 0, ~0, is_add,
- 1 /* is_static */ , 0);
+ if (is_add)
+ {
+ vnet_lisp_add_del_mapping_args_t _map_args, *map_args = &_map_args;
+ memset (map_args, 0, sizeof (map_args[0]));
+ gid_address_copy (&map_args->eid, &eid);
+ map_args->action = action;
+ map_args->is_static = 1;
+ map_args->authoritative = 0;
+ map_args->ttl = ~0;
+ rv = vnet_lisp_add_mapping (map_args, rlocs, NULL, NULL);
+ }
+ else
+ rv = vnet_lisp_del_mapping (&eid, NULL);
if (rv)
clib_warning ("failed to %s remote mapping!", is_add ? "add" : "delete");
};
/* *INDENT-ON* */
+static clib_error_t *
+lisp_nsh_set_locator_set_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ u8 locator_name_set = 0;
+ u8 *locator_set_name = 0;
+ u8 is_add = 1;
+ unformat_input_t _line_input, *line_input = &_line_input;
+ clib_error_t *error = 0;
+ int rv = 0;
+
+ /* Get a line of input. */
+ if (!unformat_user (input, unformat_line_input, line_input))
+ return 0;
+
+ while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (line_input, "ls %_%v%_", &locator_set_name))
+ locator_name_set = 1;
+ else if (unformat (line_input, "disable"))
+ is_add = 0;
+ else
+ {
+ error = clib_error_return (0, "parse error");
+ goto done;
+ }
+ }
+
+ if (!locator_name_set)
+ {
+ clib_warning ("No locator set specified!");
+ goto done;
+ }
+
+ rv = vnet_lisp_nsh_set_locator_set (locator_set_name, is_add);
+ if (0 != rv)
+ {
+ error = clib_error_return (0, "failed to %s NSH mapping!",
+ is_add ? "add" : "delete");
+ }
+
+done:
+ vec_free (locator_set_name);
+ unformat_free (line_input);
+ return error;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_nsh_set_locator_set_command) = {
+ .path = "one nsh-mapping",
+ .short_help = "one nsh-mapping [del] ls <locator-set-name>",
+ .function = lisp_nsh_set_locator_set_command_fn,
+};
+/* *INDENT-ON* */
+
+static clib_error_t *
+lisp_map_register_fallback_threshold_show_command_fn (vlib_main_t * vm,
+ unformat_input_t *
+ input,
+ vlib_cli_command_t *
+ cmd)
+{
+ u32 val = vnet_lisp_map_register_fallback_threshold_get ();
+ vlib_cli_output (vm, "map register fallback treshold value: %d", val);
+ return 0;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_map_register_fallback_threshold_show_command) = {
+ .path = "show one map-register fallback-threshold",
+ .short_help = "show one map-register fallback-threshold",
+ .function = lisp_map_register_fallback_threshold_show_command_fn,
+};
+
+/* *INDENT-ON* */
+
+static clib_error_t *
+lisp_map_register_fallback_threshold_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ unformat_input_t _line_input, *line_input = &_line_input;
+ clib_error_t *error = 0;
+ u32 val = 0;
+ int rv = 0;
+
+ /* Get a line of input. */
+ if (!unformat_user (input, unformat_line_input, line_input))
+ return 0;
+
+ while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (line_input, "%d", &val))
+ ;
+ else
+ {
+ error = clib_error_return (0, "parse error");
+ goto done;
+ }
+ }
+
+ rv = vnet_lisp_map_register_fallback_threshold_set (val);
+ if (rv)
+ {
+ error = clib_error_return (0, "setting fallback threshold failed!");
+ }
+
+done:
+ unformat_free (line_input);
+ return error;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_map_register_fallback_threshold_command) = {
+ .path = "one map-register fallback-threshold",
+ .short_help = "one map-register fallback-threshold <count>",
+ .function = lisp_map_register_fallback_threshold_command_fn,
+};
+/* *INDENT-ON* */
static clib_error_t *
lisp_pitr_set_locator_set_command_fn (vlib_main_t * vm,
if (vec_len (ls->locator_indices) == 0)
{
- s = format (s, "%-35U%-30s%-20u%-u", format_gid_address, gid,
- type, ttl, aut);
+ s = format (s, "%-35U%-20saction:%-30U%-20u%-u", format_gid_address,
+ gid, type, format_negative_mapping_action, mapit->action,
+ ttl, aut);
}
else
{
/* *INDENT-OFF* */
pool_foreach (mapit, lcm->mapping_pool,
({
+ if (mapit->pitr_set || mapit->nsh_set)
+ continue;
+
locator_set_t * ls = pool_elt_at_index (lcm->locator_set_pool,
mapit->locator_set_index);
if (filter && !((1 == filter && ls->local) ||
};
/* *INDENT-ON* */
+static clib_error_t *
+lisp_map_register_set_ttl_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ unformat_input_t _line_input, *line_input = &_line_input;
+ u32 ttl = 0;
+ u8 is_set = 0;
+ clib_error_t *error = NULL;
+
+ /* Get a line of input. */
+ if (!unformat_user (input, unformat_line_input, line_input))
+ return 0;
+
+ while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (line_input, "%u", &ttl))
+ is_set = 1;
+ else
+ {
+ vlib_cli_output (vm, "parse error: '%U'", format_unformat_error,
+ line_input);
+ goto done;
+ }
+ }
+
+ if (!is_set)
+ {
+ vlib_cli_output (vm, "expected integer value for TTL!");
+ goto done;
+ }
+
+ vnet_lisp_map_register_set_ttl (ttl);
+
+done:
+ unformat_free (line_input);
+ return error;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_map_register_set_ttl_command) = {
+ .path = "one map-register ttl",
+ .short_help = "one map-register ttl",
+ .function = lisp_map_register_set_ttl_command_fn,
+};
+/* *INDENT-ON* */
+
+static clib_error_t *
+lisp_map_register_show_ttl_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ u32 ttl = vnet_lisp_map_register_get_ttl ();
+
+ vlib_cli_output (vm, "map-register TTL: %u", ttl);
+ return 0;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_map_register_show_ttl_command) = {
+ .path = "show one map-register ttl",
+ .short_help = "show one map-register ttl",
+ .function = lisp_map_register_show_ttl_command_fn,
+};
+
+/* *INDENT-ON* */
+
static clib_error_t *
lisp_map_register_enable_disable_command_fn (vlib_main_t * vm,
unformat_input_t * input,
};
/* *INDENT-ON* */
+static clib_error_t *
+lisp_show_stats_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ u8 is_enabled = vnet_lisp_stats_enable_disable_state ();
+ vlib_cli_output (vm, "%s\n", is_enabled ? "enabled" : "disabled");
+ return 0;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_show_stats_command) = {
+ .path = "show one statistics status",
+ .short_help = "show ONE statistics enable/disable status",
+ .function = lisp_show_stats_command_fn,
+};
+/* *INDENT-ON* */
+
+static clib_error_t *
+lisp_show_stats_details_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ lisp_api_stats_t *stat, *stats = vnet_lisp_get_stats ();
+
+ if (vec_len (stats) > 0)
+ vlib_cli_output (vm,
+ "[src-EID, dst-EID] [loc-rloc, rmt-rloc] count bytes\n");
+ else
+ vlib_cli_output (vm, "No statistics found.\n");
+
+ vec_foreach (stat, stats)
+ {
+ vlib_cli_output (vm, "[%U, %U] [%U, %U] %7u %7u\n",
+ format_fid_address, &stat->seid,
+ format_fid_address, &stat->deid,
+ format_ip_address, &stat->loc_rloc,
+ format_ip_address, &stat->rmt_rloc,
+ stat->counters.packets, stat->counters.bytes);
+ }
+ vec_free (stats);
+ return 0;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_show_stats_details_command) = {
+ .path = "show one statistics details",
+ .short_help = "show ONE statistics",
+ .function = lisp_show_stats_details_command_fn,
+};
+/* *INDENT-ON* */
+
+static clib_error_t *
+lisp_stats_enable_disable_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ unformat_input_t _line_input, *line_input = &_line_input;
+ u8 enable = 0;
+
+ /* Get a line of input. */
+ if (!unformat_user (input, unformat_line_input, line_input))
+ return 0;
+
+ while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (line_input, "enable"))
+ enable = 1;
+ else if (unformat (line_input, "disable"))
+ enable = 0;
+ else
+ {
+ clib_warning ("Error: expected enable/disable!");
+ goto done;
+ }
+ }
+ vnet_lisp_stats_enable_disable (enable);
+done:
+ unformat_free (line_input);
+ return 0;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_stats_enable_disable_command) = {
+ .path = "one statistics",
+ .short_help = "enable/disable ONE statistics collecting",
+ .function = lisp_stats_enable_disable_command_fn,
+};
+/* *INDENT-ON* */
+
+static clib_error_t *
+lisp_stats_flush_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ vnet_lisp_flush_stats ();
+ return 0;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_stats_flush_command) = {
+ .path = "one statistics flush",
+ .short_help = "Flush ONE statistics",
+ .function = lisp_stats_flush_command_fn,
+};
+/* *INDENT-ON* */
+
/*
* fd.io coding-style-patch-verification: ON
*