isisd: retrofit the 'topology' command

Signed-off-by: Emanuele Di Pascale <emanuele@voltanet.io>
This commit is contained in:
Emanuele Di Pascale 2018-11-14 12:34:02 +01:00
parent a041ac8ef6
commit 22af6a806d
4 changed files with 226 additions and 49 deletions

View File

@ -1106,6 +1106,116 @@ void cli_show_isis_redistribute_ipv6(struct vty *vty, struct lyd_node *dnode,
vty_print_redistribute(vty, dnode, "ipv6");
}
/*
* XPath: /frr-isisd:isis/instance/multi-topology
*/
DEFPY(isis_topology, isis_topology_cmd,
"[no] topology "
"<ipv4-unicast"
"|ipv4-mgmt"
"|ipv6-unicast"
"|ipv4-multicast"
"|ipv6-multicast"
"|ipv6-mgmt"
"|ipv6-dstsrc>$topology "
"[overload]$overload",
NO_STR
"Configure IS-IS topologies\n"
"IPv4 unicast topology\n"
"IPv4 management topology\n"
"IPv6 unicast topology\n"
"IPv4 multicast topology\n"
"IPv6 multicast topology\n"
"IPv6 management topology\n"
"IPv6 dst-src topology\n"
"Set overload bit for topology\n")
{
char base_xpath[XPATH_MAXLEN];
/* Since IPv4-unicast is not configurable it is not present in the
* YANG model, so we need to validate it here
*/
if (strmatch(topology, "ipv4-unicast")) {
vty_out(vty, "Cannot configure IPv4 unicast topology\n");
return CMD_WARNING_CONFIG_FAILED;
}
if (strmatch(topology, "ipv4-mgmt"))
snprintf(base_xpath, XPATH_MAXLEN,
"./multi-topology/ipv4-management");
else if (strmatch(topology, "ipv6-mgmt"))
snprintf(base_xpath, XPATH_MAXLEN,
"./multi-topology/ipv6-management");
else
snprintf(base_xpath, XPATH_MAXLEN, "./multi-topology/%s",
topology);
if (no)
nb_cli_enqueue_change(vty, ".", NB_OP_DELETE, NULL);
else {
nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
nb_cli_enqueue_change(vty, "./overload",
overload ? NB_OP_CREATE : NB_OP_DELETE,
NULL);
}
return nb_cli_apply_changes(vty, base_xpath);
}
void cli_show_isis_mt_ipv4_multicast(struct vty *vty, struct lyd_node *dnode,
bool show_defaults)
{
vty_out(vty, " topology ipv4-multicast");
if (yang_dnode_exists(dnode, "./overload"))
vty_out(vty, " overload");
vty_out(vty, "\n");
}
void cli_show_isis_mt_ipv4_mgmt(struct vty *vty, struct lyd_node *dnode,
bool show_defaults)
{
vty_out(vty, " topology ipv4-mgmt");
if (yang_dnode_exists(dnode, "./overload"))
vty_out(vty, " overload");
vty_out(vty, "\n");
}
void cli_show_isis_mt_ipv6_unicast(struct vty *vty, struct lyd_node *dnode,
bool show_defaults)
{
vty_out(vty, " topology ipv6-unicast");
if (yang_dnode_exists(dnode, "./overload"))
vty_out(vty, " overload");
vty_out(vty, "\n");
}
void cli_show_isis_mt_ipv6_multicast(struct vty *vty, struct lyd_node *dnode,
bool show_defaults)
{
vty_out(vty, " topology ipv6-multicast");
if (yang_dnode_exists(dnode, "./overload"))
vty_out(vty, " overload");
vty_out(vty, "\n");
}
void cli_show_isis_mt_ipv6_mgmt(struct vty *vty, struct lyd_node *dnode,
bool show_defaults)
{
vty_out(vty, " topology ipv6-mgmt");
if (yang_dnode_exists(dnode, "./overload"))
vty_out(vty, " overload");
vty_out(vty, "\n");
}
void cli_show_isis_mt_ipv6_dstsrc(struct vty *vty, struct lyd_node *dnode,
bool show_defaults)
{
vty_out(vty, " topology ipv6-dstsrc");
if (yang_dnode_exists(dnode, "./overload"))
vty_out(vty, " overload");
vty_out(vty, "\n");
}
void isis_cli_init(void)
{
install_element(CONFIG_NODE, &router_isis_cmd);
@ -1155,6 +1265,8 @@ void isis_cli_init(void)
install_element(ISIS_NODE, &isis_default_originate_cmd);
install_element(ISIS_NODE, &isis_redistribute_cmd);
install_element(ISIS_NODE, &isis_topology_cmd);
}
#endif /* ifndef FABRICD */

View File

@ -69,5 +69,17 @@ void cli_show_isis_redistribute_ipv4(struct vty *vty, struct lyd_node *dnode,
bool show_defaults);
void cli_show_isis_redistribute_ipv6(struct vty *vty, struct lyd_node *dnode,
bool show_defaults);
void cli_show_isis_mt_ipv4_multicast(struct vty *vty, struct lyd_node *dnode,
bool show_defaults);
void cli_show_isis_mt_ipv4_mgmt(struct vty *vty, struct lyd_node *dnode,
bool show_defaults);
void cli_show_isis_mt_ipv6_unicast(struct vty *vty, struct lyd_node *dnode,
bool show_defaults);
void cli_show_isis_mt_ipv6_multicast(struct vty *vty, struct lyd_node *dnode,
bool show_defaults);
void cli_show_isis_mt_ipv6_mgmt(struct vty *vty, struct lyd_node *dnode,
bool show_defaults);
void cli_show_isis_mt_ipv6_dstsrc(struct vty *vty, struct lyd_node *dnode,
bool show_defaults);
#endif /* ISISD_ISIS_CLI_H_ */

View File

@ -1209,21 +1209,72 @@ isis_instance_redistribute_ipv6_metric_delete(enum nb_event event,
/*
* XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast
*/
static int isis_multi_topology_common(enum nb_event event,
const struct lyd_node *dnode,
const char *topology, bool create)
{
struct isis_area *area;
struct isis_area_mt_setting *setting;
uint16_t mtid = isis_str2mtid(topology);
switch (event) {
case NB_EV_VALIDATE:
if (mtid == (uint16_t)-1) {
flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
"Unknown topology %s", topology);
return NB_ERR_VALIDATION;
}
break;
case NB_EV_PREPARE:
case NB_EV_ABORT:
break;
case NB_EV_APPLY:
area = yang_dnode_get_entry(dnode, true);
setting = area_get_mt_setting(area, mtid);
setting->enabled = create;
lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 0);
break;
}
return NB_OK;
}
static int isis_multi_topology_overload_common(enum nb_event event,
const struct lyd_node *dnode,
const char *topology,
bool create)
{
struct isis_area *area;
struct isis_area_mt_setting *setting;
uint16_t mtid = isis_str2mtid(topology);
/* validation is done in isis_multi_topology_common */
if (event != NB_EV_APPLY)
return NB_OK;
area = yang_dnode_get_entry(dnode, true);
setting = area_get_mt_setting(area, mtid);
setting->overload = create;
if (setting->enabled)
lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 0);
return NB_OK;
}
static int
isis_instance_multi_topology_ipv4_multicast_create(enum nb_event event,
const struct lyd_node *dnode,
union nb_resource *resource)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_common(event, dnode, "ipv4-multicast", true);
}
static int
isis_instance_multi_topology_ipv4_multicast_delete(enum nb_event event,
const struct lyd_node *dnode)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_common(event, dnode, "ipv4-multicast",
false);
}
/*
@ -1233,15 +1284,15 @@ static int isis_instance_multi_topology_ipv4_multicast_overload_create(
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_overload_common(event, dnode,
"ipv4-multicast", true);
}
static int isis_instance_multi_topology_ipv4_multicast_overload_delete(
enum nb_event event, const struct lyd_node *dnode)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_overload_common(event, dnode,
"ipv4-multicast", false);
}
/*
@ -1251,15 +1302,13 @@ static int isis_instance_multi_topology_ipv4_management_create(
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_common(event, dnode, "ipv4-mgmt", true);
}
static int isis_instance_multi_topology_ipv4_management_delete(
enum nb_event event, const struct lyd_node *dnode)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_common(event, dnode, "ipv4-mgmt", false);
}
/*
@ -1269,15 +1318,15 @@ static int isis_instance_multi_topology_ipv4_management_overload_create(
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_overload_common(event, dnode, "ipv4-mgmt",
true);
}
static int isis_instance_multi_topology_ipv4_management_overload_delete(
enum nb_event event, const struct lyd_node *dnode)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_overload_common(event, dnode, "ipv4-mgmt",
false);
}
/*
@ -1288,16 +1337,14 @@ isis_instance_multi_topology_ipv6_unicast_create(enum nb_event event,
const struct lyd_node *dnode,
union nb_resource *resource)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_common(event, dnode, "ipv6-unicast", true);
}
static int
isis_instance_multi_topology_ipv6_unicast_delete(enum nb_event event,
const struct lyd_node *dnode)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_common(event, dnode, "ipv6-unicast", false);
}
/*
@ -1307,15 +1354,15 @@ static int isis_instance_multi_topology_ipv6_unicast_overload_create(
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_overload_common(event, dnode, "ipv6-unicast",
true);
}
static int isis_instance_multi_topology_ipv6_unicast_overload_delete(
enum nb_event event, const struct lyd_node *dnode)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_overload_common(event, dnode, "ipv6-unicast",
false);
}
/*
@ -1326,16 +1373,15 @@ isis_instance_multi_topology_ipv6_multicast_create(enum nb_event event,
const struct lyd_node *dnode,
union nb_resource *resource)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_common(event, dnode, "ipv6-multicast", true);
}
static int
isis_instance_multi_topology_ipv6_multicast_delete(enum nb_event event,
const struct lyd_node *dnode)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_common(event, dnode, "ipv6-multicast",
false);
}
/*
@ -1345,15 +1391,15 @@ static int isis_instance_multi_topology_ipv6_multicast_overload_create(
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_overload_common(event, dnode,
"ipv6-multicast", true);
}
static int isis_instance_multi_topology_ipv6_multicast_overload_delete(
enum nb_event event, const struct lyd_node *dnode)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_overload_common(event, dnode,
"ipv6-multicast", false);
}
/*
@ -1363,15 +1409,13 @@ static int isis_instance_multi_topology_ipv6_management_create(
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_common(event, dnode, "ipv6-mgmt", true);
}
static int isis_instance_multi_topology_ipv6_management_delete(
enum nb_event event, const struct lyd_node *dnode)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_common(event, dnode, "ipv6-mgmt", false);
}
/*
@ -1381,15 +1425,15 @@ static int isis_instance_multi_topology_ipv6_management_overload_create(
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_overload_common(event, dnode, "ipv6-mgmt",
true);
}
static int isis_instance_multi_topology_ipv6_management_overload_delete(
enum nb_event event, const struct lyd_node *dnode)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_overload_common(event, dnode, "ipv6-mgmt",
false);
}
/*
@ -1400,16 +1444,14 @@ isis_instance_multi_topology_ipv6_dstsrc_create(enum nb_event event,
const struct lyd_node *dnode,
union nb_resource *resource)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_common(event, dnode, "ipv6-dstsrc", true);
}
static int
isis_instance_multi_topology_ipv6_dstsrc_delete(enum nb_event event,
const struct lyd_node *dnode)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_common(event, dnode, "ipv6-dstsrc", false);
}
/*
@ -1419,15 +1461,15 @@ static int isis_instance_multi_topology_ipv6_dstsrc_overload_create(
enum nb_event event, const struct lyd_node *dnode,
union nb_resource *resource)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_overload_common(event, dnode, "ipv6-dstsrc",
true);
}
static int isis_instance_multi_topology_ipv6_dstsrc_overload_delete(
enum nb_event event, const struct lyd_node *dnode)
{
/* TODO: implement me. */
return NB_OK;
return isis_multi_topology_overload_common(event, dnode, "ipv6-dstsrc",
false);
}
/*
@ -2384,6 +2426,7 @@ const struct frr_yang_module_info frr_isisd_info = {
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast",
.cbs.create = isis_instance_multi_topology_ipv4_multicast_create,
.cbs.delete = isis_instance_multi_topology_ipv4_multicast_delete,
.cbs.cli_show = cli_show_isis_mt_ipv4_multicast,
},
{
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload",
@ -2394,6 +2437,7 @@ const struct frr_yang_module_info frr_isisd_info = {
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-management",
.cbs.create = isis_instance_multi_topology_ipv4_management_create,
.cbs.delete = isis_instance_multi_topology_ipv4_management_delete,
.cbs.cli_show = cli_show_isis_mt_ipv4_mgmt,
},
{
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-management/overload",
@ -2404,6 +2448,7 @@ const struct frr_yang_module_info frr_isisd_info = {
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-unicast",
.cbs.create = isis_instance_multi_topology_ipv6_unicast_create,
.cbs.delete = isis_instance_multi_topology_ipv6_unicast_delete,
.cbs.cli_show = cli_show_isis_mt_ipv6_unicast,
},
{
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload",
@ -2414,6 +2459,7 @@ const struct frr_yang_module_info frr_isisd_info = {
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-multicast",
.cbs.create = isis_instance_multi_topology_ipv6_multicast_create,
.cbs.delete = isis_instance_multi_topology_ipv6_multicast_delete,
.cbs.cli_show = cli_show_isis_mt_ipv6_multicast,
},
{
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload",
@ -2424,6 +2470,7 @@ const struct frr_yang_module_info frr_isisd_info = {
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-management",
.cbs.create = isis_instance_multi_topology_ipv6_management_create,
.cbs.delete = isis_instance_multi_topology_ipv6_management_delete,
.cbs.cli_show = cli_show_isis_mt_ipv6_mgmt,
},
{
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-management/overload",
@ -2434,6 +2481,7 @@ const struct frr_yang_module_info frr_isisd_info = {
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc",
.cbs.create = isis_instance_multi_topology_ipv6_dstsrc_create,
.cbs.delete = isis_instance_multi_topology_ipv6_dstsrc_delete,
.cbs.cli_show = cli_show_isis_mt_ipv6_dstsrc,
},
{
.xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload",

View File

@ -288,6 +288,7 @@ int isis_area_destroy(const char *area_tag)
return CMD_SUCCESS;
}
#ifdef FABRICD
static void area_set_mt_enabled(struct isis_area *area, uint16_t mtid,
bool enabled)
{
@ -313,6 +314,7 @@ static void area_set_mt_overload(struct isis_area *area, uint16_t mtid,
0);
}
}
#endif /* ifdef FABRICD */
int area_net_title(struct vty *vty, const char *net_title)
{
@ -1511,6 +1513,7 @@ DEFUN (no_net,
return area_clear_net_title(vty, argv[idx_word]->arg);
}
#endif /* ifdef FABRICD */
#ifdef FABRICD
DEFUN (isis_topology,
isis_topology_cmd,
"topology " ISIS_MT_NAMES " [overload]",
@ -1575,6 +1578,7 @@ DEFUN (no_isis_topology,
area_set_mt_overload(area, mtid, false);
return CMD_SUCCESS;
}
#endif /* ifdef FABRICD */
void isis_area_lsp_mtu_set(struct isis_area *area, unsigned int lsp_mtu)
{
@ -2190,9 +2194,10 @@ void isis_init()
install_element(ROUTER_NODE, &net_cmd);
install_element(ROUTER_NODE, &no_net_cmd);
#endif /* ifdef FABRICD */
#ifdef FABRICD
install_element(ROUTER_NODE, &isis_topology_cmd);
install_element(ROUTER_NODE, &no_isis_topology_cmd);
#endif /* ifdef FABRICD */
install_element(ROUTER_NODE, &log_adj_changes_cmd);
install_element(ROUTER_NODE, &no_log_adj_changes_cmd);