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,
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,
"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;
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
#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)
{
case NB_EV_PREPARE:
case NB_EV_ABORT:
case NB_EV_APPLY:
- /* TODO: implement me. */
break;
}
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
*/
case NB_EV_PREPARE:
case NB_EV_ABORT:
case NB_EV_APPLY:
- /* TODO: implement me. */
break;
}
case NB_EV_PREPARE:
case NB_EV_ABORT:
case NB_EV_APPLY:
- /* TODO: implement me. */
break;
}
case NB_EV_PREPARE:
case NB_EV_ABORT:
case NB_EV_APPLY:
- /* TODO: implement me. */
break;
}