]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: Northbound implementation for pim bfd commands.
authorSarita Patra <saritap@vmware.com>
Fri, 23 Oct 2020 12:43:16 +0000 (05:43 -0700)
committerSarita Patra <saritap@vmware.com>
Fri, 6 Nov 2020 11:41:59 +0000 (03:41 -0800)
ip_pim_bfd
ip_pim_bfd_param
no_ip_pim_bfd
no_ip_pim_bfd_param

Yang Model:
  augment /frr-interface:lib/frr-interface:interface:
    +--rw pim!
       +--rw bfd!
       |  +--rw min-rx-interval?   uint16 <300>
       |  +--rw min-tx-interval?   uint16 <300>
       |  +--rw detect_mult?       uint8 <3>

Signed-off-by: Sarita Patra <saritap@vmware.com>
pimd/pim_cmd.c
pimd/pim_nb_config.c

index a0e074b105a3e17a0721f3ba99e4eb116de720ad..a4111f080ed32a0a60ae3170074fcb3cc967bd2c 100644 (file)
@@ -8979,27 +8979,50 @@ DEFUN (ip_pim_bfd,
        PIM_STR
        "Enables BFD support\n")
 {
-       VTY_DECLVAR_CONTEXT(interface, ifp);
-       struct pim_interface *pim_ifp = ifp->info;
        struct bfd_info *bfd_info = NULL;
+       char default_rx_interval[5];
+       char default_tx_interval[5];
+       char default_detect_mult[3];
+       const struct lyd_node *igmp_enable_dnode;
+       char bfd_xpath[XPATH_MAXLEN];
 
-       if (!pim_ifp) {
-               if (!pim_cmd_interface_add(vty, ifp)) {
-                       vty_out(vty,
-                               "Could not enable PIM SM on interface %s\n",
-                               ifp->name);
-                       return CMD_WARNING;
-               }
+       igmp_enable_dnode = yang_dnode_get(vty->candidate_config->dnode,
+                       "%s/frr-igmp:igmp/igmp-enable",
+                       VTY_CURR_XPATH);
+       if (!igmp_enable_dnode)
+               nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY,
+                               "true");
+       else {
+               if (!yang_dnode_get_bool(igmp_enable_dnode, "."))
+                       nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY,
+                                       "true");
        }
-       pim_ifp = ifp->info;
 
-       bfd_info = pim_ifp->bfd_info;
+       snprintf(default_rx_interval, sizeof(default_rx_interval), "%d",
+                       BFD_DEF_MIN_RX);
+       snprintf(default_tx_interval, sizeof(default_tx_interval), "%d",
+                       BFD_DEF_MIN_TX);
+       snprintf(default_detect_mult, sizeof(default_detect_mult), "%d",
+                       BFD_DEF_DETECT_MULT);
 
-       if (!bfd_info || !CHECK_FLAG(bfd_info->flags, BFD_FLAG_PARAM_CFG))
-               pim_bfd_if_param_set(ifp, BFD_DEF_MIN_RX, BFD_DEF_MIN_TX,
-                                    BFD_DEF_DETECT_MULT, 1);
+       snprintf(bfd_xpath, sizeof(bfd_xpath), "%s/frr-pim:pim/bfd",
+                       VTY_CURR_XPATH);
+       bfd_info = nb_running_get_entry(NULL, bfd_xpath, false);
 
-       return CMD_SUCCESS;
+       if (!bfd_info ||
+           !CHECK_FLAG(bfd_info->flags, BFD_FLAG_PARAM_CFG)) {
+               nb_cli_enqueue_change(vty, "./bfd/min-rx-interval",
+                               NB_OP_MODIFY, default_rx_interval);
+               nb_cli_enqueue_change(vty, "./bfd/min-tx-interval",
+                               NB_OP_MODIFY, default_tx_interval);
+               nb_cli_enqueue_change(vty, "./bfd/detect_mult",
+                               NB_OP_MODIFY,
+                               default_detect_mult);
+
+               return nb_cli_apply_changes(vty, "./frr-pim:pim");
+       }
+
+       return NB_OK;
 }
 
 DEFUN (no_ip_pim_bfd,
@@ -9010,20 +9033,9 @@ DEFUN (no_ip_pim_bfd,
        PIM_STR
        "Disables BFD support\n")
 {
-       VTY_DECLVAR_CONTEXT(interface, ifp);
-       struct pim_interface *pim_ifp = ifp->info;
-
-       if (!pim_ifp) {
-               vty_out(vty, "Pim not enabled on this interface\n");
-               return CMD_WARNING;
-       }
+       nb_cli_enqueue_change(vty, "./bfd", NB_OP_DESTROY, NULL);
 
-       if (pim_ifp->bfd_info) {
-               pim_bfd_reg_dereg_all_nbr(ifp, ZEBRA_BFD_DEST_DEREGISTER);
-               bfd_info_free(&(pim_ifp->bfd_info));
-       }
-
-       return CMD_SUCCESS;
+       return nb_cli_apply_changes(vty, "./frr-pim:pim");
 }
 
 DEFUN (ip_pim_bsm,
@@ -9128,7 +9140,6 @@ DEFUN(
        "Desired min transmit interval\n")
 #endif /* HAVE_BFDD */
 {
-       VTY_DECLVAR_CONTEXT(interface, ifp);
        int idx_number = 3;
        int idx_number_2 = 4;
        int idx_number_3 = 5;
@@ -9136,26 +9147,35 @@ DEFUN(
        uint32_t tx_val;
        uint8_t dm_val;
        int ret;
-       struct pim_interface *pim_ifp = ifp->info;
-
-       if (!pim_ifp) {
-               if (!pim_cmd_interface_add(vty, ifp)) {
-                       vty_out(vty,
-                               "Could not enable PIM SM on interface %s\n",
-                               ifp->name);
-                       return CMD_WARNING;
-               }
-       }
+       const struct lyd_node *igmp_enable_dnode;
 
-       if ((ret = bfd_validate_param(
-                    vty, argv[idx_number]->arg, argv[idx_number_2]->arg,
-                    argv[idx_number_3]->arg, &dm_val, &rx_val, &tx_val))
-           != CMD_SUCCESS)
+       if ((ret = bfd_validate_param(vty, argv[idx_number]->arg,
+                                       argv[idx_number_2]->arg,
+                                       argv[idx_number_3]->arg, &dm_val, &rx_val,
+                                       &tx_val))
+                       != CMD_SUCCESS)
                return ret;
 
-       pim_bfd_if_param_set(ifp, rx_val, tx_val, dm_val, 0);
+       igmp_enable_dnode = yang_dnode_get(vty->candidate_config->dnode,
+                       "%s/frr-igmp:igmp/igmp-enable",
+                       VTY_CURR_XPATH);
+       if (!igmp_enable_dnode)
+               nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY,
+                               "true");
+       else {
+               if (!yang_dnode_get_bool(igmp_enable_dnode, "."))
+                       nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY,
+                                       "true");
+       }
 
-       return CMD_SUCCESS;
+       nb_cli_enqueue_change(vty, "./bfd/min-rx-interval", NB_OP_MODIFY,
+                       argv[idx_number_2]->arg);
+       nb_cli_enqueue_change(vty, "./bfd/min-tx-interval", NB_OP_MODIFY,
+                       argv[idx_number_3]->arg);
+       nb_cli_enqueue_change(vty, "./bfd/detect_mult", NB_OP_MODIFY,
+                       argv[idx_number]->arg);
+
+       return nb_cli_apply_changes(vty, "./frr-pim:pim");
 }
 
 #if HAVE_BFDD == 0
index b3abb345a7e44705a5438d257a1c1e7d4517c129..ef949d954a39e0ec3167f0842374b53e90edafdb 100644 (file)
@@ -23,6 +23,7 @@
 #include "pim_igmpv3.h"
 #include "pim_pim.h"
 #include "pim_mlag.h"
+#include "pim_bfd.h"
 
 static void pim_if_membership_clear(struct interface *ifp)
 {
@@ -1159,7 +1160,6 @@ int lib_interface_pim_bfd_create(struct nb_cb_create_args *args)
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
@@ -1168,18 +1168,68 @@ int lib_interface_pim_bfd_create(struct nb_cb_create_args *args)
 
 int lib_interface_pim_bfd_destroy(struct nb_cb_destroy_args *args)
 {
+       struct interface *ifp;
+       struct pim_interface *pim_ifp;
+       const struct lyd_node *if_dnode;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
-       case NB_EV_PREPARE:
+               if_dnode = yang_dnode_get_parent(args->dnode, "interface");
+               if (!is_pim_interface(if_dnode)) {
+                       snprintf(args->errmsg, args->errmsg_len,
+                                "Pim not enabled on this interface");
+                       return NB_ERR_VALIDATION;
+               }
+               break;
        case NB_EV_ABORT:
+       case NB_EV_PREPARE:
+               break;
        case NB_EV_APPLY:
-               /* TODO: implement me. */
+               ifp = nb_running_get_entry(args->dnode->parent, NULL, true);
+               pim_ifp = ifp->info;
+               if (pim_ifp->bfd_info) {
+                       pim_bfd_reg_dereg_all_nbr(ifp,
+                                       ZEBRA_BFD_DEST_DEREGISTER);
+                       bfd_info_free(&(pim_ifp->bfd_info));
+               }
                break;
        }
 
        return NB_OK;
 }
 
+/*
+ * XPath: /frr-interface:lib/interface/frr-pim:pim/bfd
+ */
+void lib_interface_pim_bfd_apply_finish(struct nb_cb_apply_finish_args *args)
+{
+       struct interface *ifp;
+       struct pim_interface *pim_ifp;
+       uint32_t min_rx;
+       uint32_t min_tx;
+       uint8_t detect_mult;
+
+       ifp = nb_running_get_entry(args->dnode->parent, NULL, true);
+       pim_ifp = ifp->info;
+
+       if (!pim_ifp) {
+               zlog_debug("Pim not enabled on this interface");
+               return;
+       }
+
+       min_rx = yang_dnode_get_uint16(args->dnode, "./min-rx-interval");
+       min_tx = yang_dnode_get_uint16(args->dnode, "./min-tx-interval");
+       detect_mult = yang_dnode_get_uint8(args->dnode, "./detect_mult");
+
+       if ((min_rx == BFD_DEF_MIN_RX) && (min_tx == BFD_DEF_MIN_TX)
+                       && (detect_mult == BFD_DEF_DETECT_MULT))
+               pim_bfd_if_param_set(ifp, min_rx, min_tx, detect_mult, 1);
+       else
+               pim_bfd_if_param_set(ifp, min_rx, min_tx, detect_mult, 0);
+
+       nb_running_set_entry(args->dnode, pim_ifp->bfd_info);
+}
+
 /*
  * XPath: /frr-interface:lib/interface/frr-pim:pim/bfd/min-rx-interval
  */
@@ -1190,7 +1240,6 @@ int lib_interface_pim_bfd_min_rx_interval_modify(struct nb_cb_modify_args *args)
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
@@ -1207,7 +1256,6 @@ int lib_interface_pim_bfd_min_tx_interval_modify(struct nb_cb_modify_args *args)
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
@@ -1224,7 +1272,6 @@ int lib_interface_pim_bfd_detect_mult_modify(struct nb_cb_modify_args *args)
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }