From b73779d3d037f2503164532f166527ec9e0f799d Mon Sep 17 00:00:00 2001 From: Sarita Patra Date: Fri, 23 Oct 2020 05:43:16 -0700 Subject: [PATCH] pimd: Northbound implementation for pim bfd commands. 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 --- pimd/pim_cmd.c | 110 +++++++++++++++++++++++++------------------ pimd/pim_nb_config.c | 59 ++++++++++++++++++++--- 2 files changed, 118 insertions(+), 51 deletions(-) diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index a0e074b105..a4111f080e 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -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 diff --git a/pimd/pim_nb_config.c b/pimd/pim_nb_config.c index b3abb345a7..ef949d954a 100644 --- a/pimd/pim_nb_config.c +++ b/pimd/pim_nb_config.c @@ -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; } -- 2.39.5