]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd: migrate BFD command to northbound
authorRafael Zalamena <rzalamena@opensourcerouting.org>
Wed, 12 Jun 2019 18:20:17 +0000 (15:20 -0300)
committerRafael Zalamena <rzalamena@opensourcerouting.org>
Tue, 9 Jul 2019 16:22:46 +0000 (13:22 -0300)
Specify the ISIS BFD command in the YANG model and implement the
northbound callbacks.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
isisd/isis_cli.c
isisd/isis_cli.h
isisd/isis_northbound.c
yang/frr-isisd.yang

index 0334b98a122fb71c54a0704b8d97cf068a266457..7ca4c8795c7595746aeb7ab264f0c7f6d2d66680 100644 (file)
@@ -332,6 +332,39 @@ void cli_show_ip_isis_ipv6(struct vty *vty, struct lyd_node *dnode,
                yang_dnode_get_string(dnode, "../area-tag"));
 }
 
+/*
+ * XPath: /frr-interface:lib/interface/frr-isisd:isis/bfd-monitoring
+ */
+DEFPY(isis_bfd,
+      isis_bfd_cmd,
+      "[no] isis bfd",
+      NO_STR
+      PROTO_HELP
+      "Enable BFD support\n")
+{
+       const struct lyd_node *dnode;
+
+       dnode = yang_dnode_get(vty->candidate_config->dnode,
+                              "%s/frr-isisd:isis", VTY_CURR_XPATH);
+       if (dnode == NULL)
+               return CMD_SUCCESS;
+
+       nb_cli_enqueue_change(vty, "./frr-isisd:isis/bfd-monitoring",
+                             NB_OP_MODIFY, no ? "false" : "true");
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+void cli_show_ip_isis_bfd_monitoring(struct vty *vty, struct lyd_node *dnode,
+                                    bool show_defaults)
+{
+       if (show_defaults == false)
+               vty_out(vty, " %s" PROTO_NAME " bfd\n",
+                       yang_dnode_get_bool(dnode, NULL) ? "" : "no ");
+       else
+               vty_out(vty, " no " PROTO_NAME " bfd\n");
+}
+
 /*
  * XPath: /frr-isisd:isis/instance/area-address
  */
@@ -1949,6 +1982,7 @@ void isis_cli_init(void)
        install_element(INTERFACE_NODE, &ip_router_isis_cmd);
        install_element(INTERFACE_NODE, &ip6_router_isis_cmd);
        install_element(INTERFACE_NODE, &no_ip_router_isis_cmd);
+       install_element(INTERFACE_NODE, &isis_bfd_cmd);
 
        install_element(ISIS_NODE, &net_cmd);
 
index 8dadf6098183cd44260f1f8d5caea99ceb4f1ad4..6621dc0fc0581158a87a6f9d3e68227f71a35d0f 100644 (file)
@@ -27,6 +27,8 @@ void cli_show_ip_isis_ipv4(struct vty *vty, struct lyd_node *dnode,
                           bool show_defaults);
 void cli_show_ip_isis_ipv6(struct vty *vty, struct lyd_node *dnode,
                           bool show_defaults);
+void cli_show_ip_isis_bfd_monitoring(struct vty *vty, struct lyd_node *dnode,
+                                    bool show_defaults);
 void cli_show_isis_area_address(struct vty *vty, struct lyd_node *dnode,
                                bool show_defaults);
 void cli_show_isis_is_type(struct vty *vty, struct lyd_node *dnode,
index ffc6ee0464b69f27b27746d80ac870c9bb83d2af..a4869db1e8d6fb47c2cbffaf083a8ecd982e5bdb 100644 (file)
@@ -25,6 +25,8 @@
 #include "libfrr.h"
 #include "linklist.h"
 #include "log.h"
+#include "lib/bfd.h"
+#include "isisd/isis_bfd.h"
 #include "isisd/isis_constants.h"
 #include "isisd/isis_common.h"
 #include "isisd/isis_flags.h"
@@ -1702,6 +1704,42 @@ static int lib_interface_isis_ipv6_routing_modify(enum nb_event event,
        return NB_OK;
 }
 
+/*
+ * XPath: /frr-interface:lib/interface/frr-isisd:isis/bfd-monitoring
+ */
+static int lib_interface_isis_bfd_monitoring_modify(enum nb_event event,
+                                                   const struct lyd_node *dnode,
+                                                   union nb_resource *resource)
+{
+       struct isis_circuit *circuit;
+       bool bfd_monitoring;
+
+       if (event != NB_EV_APPLY)
+               return NB_OK;
+
+       circuit = nb_running_get_entry(dnode, NULL, true);
+       bfd_monitoring = yang_dnode_get_bool(dnode, NULL);
+
+       if (bfd_monitoring) {
+               /* Sanity check: BFD session is already registered. */
+               if (circuit->bfd_info != NULL)
+                       return NB_OK;
+
+               isis_bfd_circuit_param_set(circuit, BFD_DEF_MIN_RX,
+                                          BFD_DEF_MIN_TX, BFD_DEF_DETECT_MULT,
+                                          true);
+       } else {
+               /* Sanity check: no BFD session was registered. */
+               if (circuit->bfd_info == NULL)
+                       return NB_OK;
+
+               isis_bfd_circuit_cmd(circuit, ZEBRA_BFD_DEST_DEREGISTER);
+               bfd_info_free(&circuit->bfd_info);
+       }
+
+       return NB_OK;
+}
+
 /*
  * XPath: /frr-interface:lib/interface/frr-isisd:isis/csnp-interval/level-1
  */
@@ -3211,6 +3249,11 @@ const struct frr_yang_module_info frr_isisd_info = {
                                .modify = lib_interface_isis_ipv6_routing_modify,
                        },
                },
+               {
+                       .xpath = "/frr-interface:lib/interface/frr-isisd:isis/bfd-monitoring",
+                       .cbs.modify = lib_interface_isis_bfd_monitoring_modify,
+                       .cbs.cli_show = cli_show_ip_isis_bfd_monitoring,
+               },
                {
                        .xpath = "/frr-interface:lib/interface/frr-isisd:isis/csnp-interval",
                        .cbs = {
index 7b132cb61ed929265433fbdf844a91110e18e8aa..05a896a1dbd7d7344b12adaaee45491a4e0df58f 100644 (file)
@@ -756,6 +756,12 @@ module frr-isisd {
           "IS-type of this circuit.";
       }
 
+      leaf bfd-monitoring {
+        type boolean;
+        default false;
+        description "Monitor IS-IS peers on this circuit.";
+      }
+
       container csnp-interval {
         description
           "Complete Sequence Number PDU (CSNP) generation interval.";