summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmanuele Di Pascale <emanuele@voltanet.io>2018-11-14 14:35:43 +0100
committerEmanuele Di Pascale <emanuele@voltanet.io>2018-12-18 15:24:46 +0100
commitd082076585baa46e58d7becaabb311ea7f40ec0c (patch)
tree3604fb86d6013dc650e1cea6c5c00c3c6e49fb82
parent9302fbb69303b47fbb6f8d3f8ad624494ab2cfed (diff)
isisd: retrofit the 'isis network' command
remove the return value and redundant validations from isis_circuit_circ_type_set(), since they are no longer needed. Signed-off-by: Emanuele Di Pascale <emanuele@voltanet.io>
-rw-r--r--isisd/isis_circuit.c17
-rw-r--r--isisd/isis_circuit.h2
-rw-r--r--isisd/isis_cli.c27
-rw-r--r--isisd/isis_cli.h2
-rw-r--r--isisd/isis_northbound.c39
-rw-r--r--isisd/isis_vty_isisd.c44
6 files changed, 69 insertions, 62 deletions
diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c
index e76e27a7dc..356cbde812 100644
--- a/isisd/isis_circuit.c
+++ b/isisd/isis_circuit.c
@@ -1261,35 +1261,22 @@ struct cmd_node interface_node = {
INTERFACE_NODE, "%s(config-if)# ", 1,
};
-ferr_r isis_circuit_circ_type_set(struct isis_circuit *circuit, int circ_type)
+void isis_circuit_circ_type_set(struct isis_circuit *circuit, int circ_type)
{
if (circuit->circ_type == circ_type)
- return ferr_ok();
-
- /* Changing the network type to/of loopback or unknown interfaces
- * is not supported. */
- if (circ_type == CIRCUIT_T_UNKNOWN || circ_type == CIRCUIT_T_LOOPBACK
- || circuit->circ_type == CIRCUIT_T_LOOPBACK) {
- return ferr_cfg_invalid(
- "cannot change network type on unknown interface");
- }
+ return;
if (circuit->state != C_STATE_UP) {
circuit->circ_type = circ_type;
circuit->circ_type_config = circ_type;
} else {
struct isis_area *area = circuit->area;
- if (circ_type == CIRCUIT_T_BROADCAST
- && !if_is_broadcast(circuit->interface))
- return ferr_cfg_reality(
- "cannot configure non-broadcast interface for broadcast operation");
isis_csm_state_change(ISIS_DISABLE, circuit, area);
circuit->circ_type = circ_type;
circuit->circ_type_config = circ_type;
isis_csm_state_change(ISIS_ENABLE, circuit, area);
}
- return ferr_ok();
}
int isis_circuit_mt_enabled_set(struct isis_circuit *circuit, uint16_t mtid,
diff --git a/isisd/isis_circuit.h b/isisd/isis_circuit.h
index 5a0d4ffbab..73ead8f7da 100644
--- a/isisd/isis_circuit.h
+++ b/isisd/isis_circuit.h
@@ -184,7 +184,7 @@ void isis_circuit_af_set(struct isis_circuit *circuit, bool ip_router,
bool ipv6_router);
ferr_r isis_circuit_passive_set(struct isis_circuit *circuit, bool passive);
void isis_circuit_is_type_set(struct isis_circuit *circuit, int is_type);
-ferr_r isis_circuit_circ_type_set(struct isis_circuit *circuit, int circ_type);
+void isis_circuit_circ_type_set(struct isis_circuit *circuit, int circ_type);
ferr_r isis_circuit_metric_set(struct isis_circuit *circuit, int level,
int metric);
diff --git a/isisd/isis_cli.c b/isisd/isis_cli.c
index 1102005d8c..4be87a791f 100644
--- a/isisd/isis_cli.c
+++ b/isisd/isis_cli.c
@@ -1799,6 +1799,31 @@ void cli_show_ip_isis_circ_type(struct vty *vty, struct lyd_node *dnode,
}
}
+/*
+ * XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
+ */
+DEFPY(isis_network, isis_network_cmd, "[no] isis network point-to-point",
+ NO_STR
+ "IS-IS routing protocol\n"
+ "Set network type\n"
+ "point-to-point network type\n")
+{
+ nb_cli_enqueue_change(vty, "./frr-isisd:isis/network-type",
+ NB_OP_MODIFY,
+ no ? "broadcast" : "point-to-point");
+
+ return nb_cli_apply_changes(vty, NULL);
+}
+
+void cli_show_ip_isis_network_type(struct vty *vty, struct lyd_node *dnode,
+ bool show_defaults)
+{
+ if (yang_dnode_get_enum(dnode, NULL) != CIRCUIT_T_P2P)
+ vty_out(vty, " no");
+
+ vty_out(vty, " isis network point-to-point\n");
+}
+
void isis_cli_init(void)
{
install_element(CONFIG_NODE, &router_isis_cmd);
@@ -1879,6 +1904,8 @@ void isis_cli_init(void)
install_element(INTERFACE_NODE, &isis_circuit_type_cmd);
install_element(INTERFACE_NODE, &no_isis_circuit_type_cmd);
+
+ install_element(INTERFACE_NODE, &isis_network_cmd);
}
#endif /* ifndef FABRICD */
diff --git a/isisd/isis_cli.h b/isisd/isis_cli.h
index 6001f8bcae..0bc7e1c81c 100644
--- a/isisd/isis_cli.h
+++ b/isisd/isis_cli.h
@@ -115,5 +115,7 @@ void cli_show_ip_isis_mt_ipv6_dstsrc(struct vty *vty, struct lyd_node *dnode,
bool show_defaults);
void cli_show_ip_isis_circ_type(struct vty *vty, struct lyd_node *dnode,
bool show_defaults);
+void cli_show_ip_isis_network_type(struct vty *vty, struct lyd_node *dnode,
+ bool show_defaults);
#endif /* ISISD_ISIS_CLI_H_ */
diff --git a/isisd/isis_northbound.c b/isisd/isis_northbound.c
index 562c77b9d0..125b80aab4 100644
--- a/isisd/isis_northbound.c
+++ b/isisd/isis_northbound.c
@@ -2092,14 +2092,48 @@ static int lib_interface_isis_network_type_modify(enum nb_event event,
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ struct isis_circuit *circuit;
+ int net_type = yang_dnode_get_enum(dnode, NULL);
+
+ switch (event) {
+ case NB_EV_VALIDATE:
+ circuit = yang_dnode_get_entry(dnode, false);
+ if (!circuit)
+ break;
+ if (circuit->circ_type == CIRCUIT_T_LOOPBACK
+ || circuit->circ_type == CIRCUIT_T_UNKNOWN) {
+ flog_warn(
+ EC_LIB_NB_CB_CONFIG_VALIDATE,
+ "Cannot change network type on unknown or loopback interface");
+ return NB_ERR_VALIDATION;
+ }
+ if (net_type == CIRCUIT_T_BROADCAST
+ && circuit->state == C_STATE_UP
+ && !if_is_broadcast(circuit->interface)) {
+ flog_warn(
+ EC_LIB_NB_CB_CONFIG_VALIDATE,
+ "Cannot configure non-broadcast interface for broadcast operation");
+ return NB_ERR_VALIDATION;
+ }
+ break;
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ break;
+ case NB_EV_APPLY:
+ circuit = yang_dnode_get_entry(dnode, true);
+ isis_circuit_circ_type_set(circuit, net_type);
+ break;
+ }
+
return NB_OK;
}
static int lib_interface_isis_network_type_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
+ /* FIXME: This cannot be done in FRR. Not sure what the intended
+ * behavior is.
+ */
return NB_OK;
}
@@ -2813,6 +2847,7 @@ const struct frr_yang_module_info frr_isisd_info = {
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/network-type",
.cbs.modify = lib_interface_isis_network_type_modify,
.cbs.delete = lib_interface_isis_network_type_delete,
+ .cbs.cli_show = cli_show_ip_isis_network_type,
},
{
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/passive",
diff --git a/isisd/isis_vty_isisd.c b/isisd/isis_vty_isisd.c
index d114085f88..1208420272 100644
--- a/isisd/isis_vty_isisd.c
+++ b/isisd/isis_vty_isisd.c
@@ -43,47 +43,6 @@ static int level_for_arg(const char *arg)
return IS_LEVEL_2;
}
-DEFUN (isis_network,
- isis_network_cmd,
- "isis network point-to-point",
- "IS-IS routing protocol\n"
- "Set network type\n"
- "point-to-point network type\n")
-{
- struct isis_circuit *circuit = isis_circuit_lookup(vty);
- if (!circuit)
- return CMD_ERR_NO_MATCH;
-
- if (isis_circuit_circ_type_set(circuit, CIRCUIT_T_P2P)) {
- vty_out(vty,
- "isis network point-to-point is valid only on broadcast interfaces\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- return CMD_SUCCESS;
-}
-
-DEFUN (no_isis_network,
- no_isis_network_cmd,
- "no isis network point-to-point",
- NO_STR
- "IS-IS routing protocol\n"
- "Set network type for circuit\n"
- "point-to-point network type\n")
-{
- struct isis_circuit *circuit = isis_circuit_lookup(vty);
- if (!circuit)
- return CMD_ERR_NO_MATCH;
-
- if (isis_circuit_circ_type_set(circuit, CIRCUIT_T_BROADCAST)) {
- vty_out(vty,
- "isis network point-to-point is valid only on broadcast interfaces\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- return CMD_SUCCESS;
-}
-
DEFUN (isis_priority,
isis_priority_cmd,
"isis priority (0-127)",
@@ -161,9 +120,6 @@ DEFUN (no_isis_priority_level,
void isis_vty_daemon_init(void)
{
- install_element(INTERFACE_NODE, &isis_network_cmd);
- install_element(INTERFACE_NODE, &no_isis_network_cmd);
-
install_element(INTERFACE_NODE, &isis_priority_cmd);
install_element(INTERFACE_NODE, &no_isis_priority_cmd);
install_element(INTERFACE_NODE, &isis_priority_level_cmd);