]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_nb_config.c
Merge pull request #7669 from ranjanyash54/2370
[mirror_frr.git] / pimd / pim_nb_config.c
index acc427039ed0875f0265eda4c9de425dea586b2d..ba044de2f847e9ac22092c849b59bf415ffd08b3 100644 (file)
 #include "pim_mlag.h"
 #include "pim_bfd.h"
 #include "pim_static.h"
+#include "pim_ssm.h"
+#include "pim_ssmpingd.h"
+#include "pim_vxlan.h"
+#include "log.h"
+#include "lib_errors.h"
 
 static void pim_if_membership_clear(struct interface *ifp)
 {
@@ -51,7 +56,7 @@ static void pim_if_membership_clear(struct interface *ifp)
  * local membership information.
  */
 static void pim_if_membership_refresh(struct interface *ifp)
-{       
+{
        struct pim_interface *pim_ifp;
        struct listnode *sock_node;
        struct igmp_sock *igmp;
@@ -100,7 +105,7 @@ static void pim_if_membership_refresh(struct interface *ifp)
                                        sg.src = src->source_addr;
                                        sg.grp = grp->group_addr;
                                        pim_ifchannel_local_membership_add(
-                                                       ifp, &sg, false /*is_vxlan*/);
+                                               ifp, &sg, false /*is_vxlan*/);
                                }
 
                        } /* scan group sources */
@@ -116,43 +121,43 @@ static void pim_if_membership_refresh(struct interface *ifp)
 
 static int pim_cmd_interface_add(struct interface *ifp)
 {
-        struct pim_interface *pim_ifp = ifp->info;
+       struct pim_interface *pim_ifp = ifp->info;
 
-        if (!pim_ifp)
-                pim_ifp = pim_if_new(ifp, false, true, false, false);
-        else
-                PIM_IF_DO_PIM(pim_ifp->options);
+       if (!pim_ifp)
+               pim_ifp = pim_if_new(ifp, false, true, false, false);
+       else
+               PIM_IF_DO_PIM(pim_ifp->options);
 
-        pim_if_addr_add_all(ifp);
-        pim_if_membership_refresh(ifp);
+       pim_if_addr_add_all(ifp);
+       pim_if_membership_refresh(ifp);
 
-        pim_if_create_pimreg(pim_ifp->pim);
-        return 1;
+       pim_if_create_pimreg(pim_ifp->pim);
+       return 1;
 }
 
 static int pim_cmd_interface_delete(struct interface *ifp)
 {
-        struct pim_interface *pim_ifp = ifp->info;
+       struct pim_interface *pim_ifp = ifp->info;
 
-        if (!pim_ifp)
-                return 1;
+       if (!pim_ifp)
+               return 1;
 
-        PIM_IF_DONT_PIM(pim_ifp->options);
+       PIM_IF_DONT_PIM(pim_ifp->options);
 
-        pim_if_membership_clear(ifp);
+       pim_if_membership_clear(ifp);
 
-        /*
-         * pim_sock_delete() removes all neighbors from
-         * pim_ifp->pim_neighbor_list.
-         */
-        pim_sock_delete(ifp, "pim unconfigured on interface");
+       /*
+        * pim_sock_delete() removes all neighbors from
+        * pim_ifp->pim_neighbor_list.
+        */
+       pim_sock_delete(ifp, "pim unconfigured on interface");
 
-        if (!PIM_IF_TEST_IGMP(pim_ifp->options)) {
-                pim_if_addr_del_all(ifp);
-                pim_if_delete(ifp);
-        }
+       if (!PIM_IF_TEST_IGMP(pim_ifp->options)) {
+               pim_if_addr_del_all(ifp);
+               pim_if_delete(ifp);
+       }
 
-        return 1;
+       return 1;
 }
 
 static int interface_pim_use_src_cmd_worker(struct interface *ifp,
@@ -185,6 +190,331 @@ static int interface_pim_use_src_cmd_worker(struct interface *ifp,
        return ret;
 }
 
+static int pim_cmd_spt_switchover(struct pim_instance *pim,
+               enum pim_spt_switchover spt,
+               const char *plist)
+{
+       pim->spt.switchover = spt;
+
+       switch (pim->spt.switchover) {
+       case PIM_SPT_IMMEDIATE:
+               XFREE(MTYPE_PIM_PLIST_NAME, pim->spt.plist);
+
+               pim_upstream_add_lhr_star_pimreg(pim);
+               break;
+       case PIM_SPT_INFINITY:
+               pim_upstream_remove_lhr_star_pimreg(pim, plist);
+
+               XFREE(MTYPE_PIM_PLIST_NAME, pim->spt.plist);
+
+               if (plist)
+                       pim->spt.plist = XSTRDUP(MTYPE_PIM_PLIST_NAME, plist);
+               break;
+       }
+
+       return NB_OK;
+}
+
+static int pim_ssm_cmd_worker(struct pim_instance *pim, const char *plist,
+               char *errmsg, size_t errmsg_len)
+{
+       int result = pim_ssm_range_set(pim, pim->vrf_id, plist);
+       int ret = NB_ERR;
+
+       if (result == PIM_SSM_ERR_NONE)
+               return NB_OK;
+
+       switch (result) {
+       case PIM_SSM_ERR_NO_VRF:
+               snprintf(errmsg, errmsg_len,
+                        "VRF doesn't exist");
+               break;
+       case PIM_SSM_ERR_DUP:
+               snprintf(errmsg, errmsg_len,
+                        "duplicate config");
+               break;
+       default:
+               snprintf(errmsg, errmsg_len,
+                        "ssm range config failed");
+       }
+
+       return ret;
+}
+
+static int ip_no_msdp_mesh_group_cmd_worker(struct pim_instance *pim,
+               const char *mg,
+               char *errmsg, size_t errmsg_len)
+{
+       enum pim_msdp_err result;
+
+       result = pim_msdp_mg_del(pim, mg);
+
+       switch (result) {
+       case PIM_MSDP_ERR_NONE:
+               break;
+       case PIM_MSDP_ERR_NO_MG:
+               snprintf(errmsg, errmsg_len,
+                        "%% mesh-group does not exist");
+               break;
+       default:
+               snprintf(errmsg, errmsg_len,
+                        "mesh-group source del failed");
+       }
+
+       return result ? NB_ERR : NB_OK;
+}
+
+static int ip_msdp_mesh_group_member_cmd_worker(struct pim_instance *pim,
+               const char *mg,
+               struct in_addr mbr_ip,
+               char *errmsg, size_t errmsg_len)
+{
+       enum pim_msdp_err result;
+       int ret = NB_OK;
+
+       result = pim_msdp_mg_mbr_add(pim, mg, mbr_ip);
+
+       switch (result) {
+       case PIM_MSDP_ERR_NONE:
+               break;
+       case PIM_MSDP_ERR_OOM:
+               ret = NB_ERR;
+               snprintf(errmsg, errmsg_len,
+                        "%% Out of memory");
+               break;
+       case PIM_MSDP_ERR_MG_MBR_EXISTS:
+               ret = NB_ERR;
+               snprintf(errmsg, errmsg_len,
+                        "%% mesh-group member exists");
+               break;
+       case PIM_MSDP_ERR_MAX_MESH_GROUPS:
+               ret = NB_ERR;
+               snprintf(errmsg, errmsg_len,
+                        "%% Only one mesh-group allowed currently");
+               break;
+       default:
+               ret = NB_ERR;
+               snprintf(errmsg, errmsg_len,
+                        "%% member add failed");
+       }
+
+       return ret;
+}
+
+static int ip_no_msdp_mesh_group_member_cmd_worker(struct pim_instance *pim,
+               const char *mg,
+               struct in_addr mbr_ip,
+               char *errmsg,
+               size_t errmsg_len)
+{
+       enum pim_msdp_err result;
+
+       result = pim_msdp_mg_mbr_del(pim, mg, mbr_ip);
+
+       switch (result) {
+       case PIM_MSDP_ERR_NONE:
+               break;
+       case PIM_MSDP_ERR_NO_MG:
+               snprintf(errmsg, errmsg_len,
+                        "%% mesh-group does not exist");
+               break;
+       case PIM_MSDP_ERR_NO_MG_MBR:
+               snprintf(errmsg, errmsg_len,
+                        "%% mesh-group member does not exist");
+               break;
+       default:
+               snprintf(errmsg, errmsg_len,
+                        "%% mesh-group member del failed");
+       }
+
+       return result ? NB_ERR : NB_OK;
+}
+
+static int ip_msdp_mesh_group_source_cmd_worker(struct pim_instance *pim,
+               const char *mg,
+               struct in_addr src_ip,
+               char *errmsg, size_t errmsg_len)
+{
+       enum pim_msdp_err result;
+
+       result = pim_msdp_mg_src_add(pim, mg, src_ip);
+
+       switch (result) {
+       case PIM_MSDP_ERR_NONE:
+               break;
+       case PIM_MSDP_ERR_OOM:
+               snprintf(errmsg, errmsg_len,
+                        "%% Out of memory");
+               break;
+       case PIM_MSDP_ERR_MAX_MESH_GROUPS:
+               snprintf(errmsg, errmsg_len,
+                        "%% Only one mesh-group allowed currently");
+               break;
+       default:
+               snprintf(errmsg, errmsg_len,
+                        "%% source add failed");
+       }
+
+       return result ? NB_ERR : NB_OK;
+}
+
+static int ip_no_msdp_mesh_group_source_cmd_worker(struct pim_instance *pim,
+               const char *mg,
+               char *errmsg,
+               size_t errmsg_len)
+{
+       enum pim_msdp_err result;
+
+       result = pim_msdp_mg_src_del(pim, mg);
+
+       switch (result) {
+       case PIM_MSDP_ERR_NONE:
+               break;
+       case PIM_MSDP_ERR_NO_MG:
+               snprintf(errmsg, errmsg_len,
+                        "%% mesh-group does not exist");
+               break;
+       default:
+               snprintf(errmsg, errmsg_len,
+                        "%% mesh-group source del failed");
+       }
+
+       return result ? NB_ERR : NB_OK;
+}
+
+static int ip_msdp_peer_cmd_worker(struct pim_instance *pim,
+               struct in_addr peer_addr,
+               struct in_addr local_addr,
+               char *errmsg, size_t errmsg_len)
+{
+       enum pim_msdp_err result;
+       int ret = NB_OK;
+
+       result = pim_msdp_peer_add(pim, peer_addr, local_addr, "default",
+                       NULL /* mp_p */);
+       switch (result) {
+       case PIM_MSDP_ERR_NONE:
+               break;
+       case PIM_MSDP_ERR_OOM:
+               ret = NB_ERR;
+               snprintf(errmsg, errmsg_len,
+                        "%% Out of memory");
+               break;
+       case PIM_MSDP_ERR_PEER_EXISTS:
+               ret = NB_ERR;
+               snprintf(errmsg, errmsg_len,
+                        "%% Peer exists");
+               break;
+       case PIM_MSDP_ERR_MAX_MESH_GROUPS:
+               ret = NB_ERR;
+               snprintf(errmsg, errmsg_len,
+                        "%% Only one mesh-group allowed currently");
+               break;
+       default:
+               ret = NB_ERR;
+               snprintf(errmsg, errmsg_len,
+                        "%% peer add failed");
+       }
+
+       return ret;
+}
+
+static int ip_no_msdp_peer_cmd_worker(struct pim_instance *pim,
+               struct in_addr peer_addr,
+               char *errmsg, size_t errmsg_len)
+{
+       enum pim_msdp_err result;
+
+       result = pim_msdp_peer_del(pim, peer_addr);
+       switch (result) {
+       case PIM_MSDP_ERR_NONE:
+               break;
+       case PIM_MSDP_ERR_NO_PEER:
+               snprintf(errmsg, errmsg_len,
+                        "%% Peer does not exist");
+               break;
+       default:
+               snprintf(errmsg, errmsg_len,
+                        "%% peer del failed");
+       }
+
+       return result ? NB_ERR : NB_OK;
+}
+
+static int pim_rp_cmd_worker(struct pim_instance *pim,
+               struct in_addr rp_addr,
+               struct prefix group, const char *plist,
+               char *errmsg, size_t errmsg_len)
+{
+       char rp_str[INET_ADDRSTRLEN];
+       int result;
+
+       inet_ntop(AF_INET, &rp_addr, rp_str, sizeof(rp_str));
+
+       result = pim_rp_new(pim, rp_addr, group, plist, RP_SRC_STATIC);
+
+       if (result == PIM_RP_NO_PATH) {
+               snprintf(errmsg, errmsg_len,
+                        "No Path to RP address specified: %s", rp_str);
+               return NB_ERR_INCONSISTENCY;
+       }
+
+       if (result == PIM_GROUP_OVERLAP) {
+               snprintf(errmsg, errmsg_len,
+                        "Group range specified cannot exact match another");
+               return NB_ERR_INCONSISTENCY;
+       }
+
+       if (result == PIM_GROUP_PFXLIST_OVERLAP) {
+               snprintf(errmsg, errmsg_len,
+                        "This group is already covered by a RP prefix-list");
+               return NB_ERR_INCONSISTENCY;
+       }
+
+       if (result == PIM_RP_PFXLIST_IN_USE) {
+               snprintf(errmsg, errmsg_len,
+                        "The same prefix-list cannot be applied to multiple RPs");
+               return NB_ERR_INCONSISTENCY;
+       }
+
+       return NB_OK;
+}
+
+static int pim_no_rp_cmd_worker(struct pim_instance *pim,
+                               struct in_addr rp_addr, struct prefix group,
+                               const char *plist,
+                               char *errmsg, size_t errmsg_len)
+{
+       char rp_str[INET_ADDRSTRLEN];
+       char group_str[PREFIX2STR_BUFFER];
+       int result;
+
+       inet_ntop(AF_INET, &rp_addr, rp_str, sizeof(rp_str));
+       prefix2str(&group, group_str, sizeof(group_str));
+
+       result = pim_rp_del(pim, rp_addr, group, plist, RP_SRC_STATIC);
+
+       if (result == PIM_GROUP_BAD_ADDRESS) {
+               snprintf(errmsg, errmsg_len,
+                        "Bad group address specified: %s", group_str);
+               return NB_ERR_INCONSISTENCY;
+       }
+
+       if (result == PIM_RP_BAD_ADDRESS) {
+               snprintf(errmsg, errmsg_len,
+                        "Bad RP address specified: %s", rp_str);
+               return NB_ERR_INCONSISTENCY;
+       }
+
+       if (result == PIM_RP_NOT_FOUND) {
+               snprintf(errmsg, errmsg_len,
+                        "Unable to find specified RP");
+               return NB_ERR_INCONSISTENCY;
+       }
+
+       return NB_OK;
+}
+
 static bool is_pim_interface(const struct lyd_node *dnode)
 {
        char if_xpath[XPATH_MAXLEN];
@@ -194,7 +524,8 @@ static bool is_pim_interface(const struct lyd_node *dnode)
        yang_dnode_get_path(dnode, if_xpath, sizeof(if_xpath));
        pim_enable_dnode = yang_dnode_get(dnode, "%s/frr-pim:pim/pim-enable",
                                          if_xpath);
-       igmp_enable_dnode = yang_dnode_get(dnode, "%s/frr-igmp:igmp/igmp-enable",
+       igmp_enable_dnode = yang_dnode_get(dnode,
+                                          "%s/frr-igmp:igmp/igmp-enable",
                                           if_xpath);
 
        if (((pim_enable_dnode) &&
@@ -208,30 +539,30 @@ static bool is_pim_interface(const struct lyd_node *dnode)
 
 static int pim_cmd_igmp_start(struct interface *ifp)
 {
-        struct pim_interface *pim_ifp;
-        uint8_t need_startup = 0;
+       struct pim_interface *pim_ifp;
+       uint8_t need_startup = 0;
 
-        pim_ifp = ifp->info;
+       pim_ifp = ifp->info;
 
-        if (!pim_ifp) {
-                (void)pim_if_new(ifp, true, false, false, false);
-                need_startup = 1;
-        } else {
-                if (!PIM_IF_TEST_IGMP(pim_ifp->options)) {
-                        PIM_IF_DO_IGMP(pim_ifp->options);
-                        need_startup = 1;
-                }
-        }
+       if (!pim_ifp) {
+               (void)pim_if_new(ifp, true, false, false, false);
+               need_startup = 1;
+       } else {
+               if (!PIM_IF_TEST_IGMP(pim_ifp->options)) {
+                       PIM_IF_DO_IGMP(pim_ifp->options);
+                       need_startup = 1;
+               }
+       }
 
-        /* 'ip igmp' executed multiple times, with need_startup
-         * avoid multiple if add all and membership refresh
-         */
-        if (need_startup) {
-                pim_if_addr_add_all(ifp);
-                pim_if_membership_refresh(ifp);
-        }
+       /* 'ip igmp' executed multiple times, with need_startup
+        * avoid multiple if add all and membership refresh
+        */
+       if (need_startup) {
+               pim_if_addr_add_all(ifp);
+               pim_if_membership_refresh(ifp);
+       }
 
-        return NB_OK;
+       return NB_OK;
 }
 
 /*
@@ -444,7 +775,8 @@ int pim_register_suppress_time_modify(struct nb_cb_modify_args *args)
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/ecmp
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_ecmp_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_ecmp_modify(
+       struct nb_cb_modify_args *args)
 {
        struct vrf *vrf;
        struct pim_instance *pim;
@@ -466,7 +798,8 @@ int routing_control_plane_protocols_control_plane_protocol_pim_ecmp_modify(struc
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/ecmp-rebalance
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_ecmp_rebalance_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_ecmp_rebalance_modify(
+       struct nb_cb_modify_args *args)
 {
        struct vrf *vrf;
        struct pim_instance *pim;
@@ -489,7 +822,8 @@ int routing_control_plane_protocols_control_plane_protocol_pim_ecmp_rebalance_mo
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/keep-alive-timer
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_keep_alive_timer_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_keep_alive_timer_modify(
+       struct nb_cb_modify_args *args)
 {
        struct vrf *vrf;
        struct pim_instance *pim;
@@ -512,7 +846,8 @@ int routing_control_plane_protocols_control_plane_protocol_pim_keep_alive_timer_
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/rp-keep-alive-timer
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_rp_keep_alive_timer_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_rp_keep_alive_timer_modify(
+       struct nb_cb_modify_args *args)
 {
        struct vrf *vrf;
        struct pim_instance *pim;
@@ -536,21 +871,22 @@ int routing_control_plane_protocols_control_plane_protocol_pim_rp_keep_alive_tim
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_create(struct nb_cb_create_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_create(
+       struct nb_cb_create_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_destroy(
+       struct nb_cb_destroy_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
@@ -567,45 +903,83 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_de
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/send-v6-secondary
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_send_v6_secondary_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_send_v6_secondary_modify(
+       struct nb_cb_modify_args *args)
 {
+       struct vrf *vrf;
+       struct pim_instance *pim;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
+               break;
        case NB_EV_APPLY:
-               /* TODO: implement me. */
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               pim->send_v6_secondary = yang_dnode_get_bool(args->dnode, NULL);
                break;
        }
 
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_send_v6_secondary_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_send_v6_secondary_destroy(
+       struct nb_cb_destroy_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
        return NB_OK;
 }
 
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/spt-switchover
+ */
+void routing_control_plane_protocols_control_plane_protocol_pim_address_family_spt_switchover_apply_finish(
+       struct nb_cb_apply_finish_args *args)
+{
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       int spt_switch_action;
+       const char *prefix_list = NULL;
+
+       vrf = nb_running_get_entry(args->dnode, NULL, true);
+       pim = vrf->info;
+       spt_switch_action = yang_dnode_get_enum(args->dnode, "./spt-action");
+
+       switch (spt_switch_action) {
+       case PIM_SPT_INFINITY:
+               if (yang_dnode_exists(args->dnode,
+                                     "./spt-infinity-prefix-list"))
+                       prefix_list = yang_dnode_get_string(
+                               args->dnode, "./spt-infinity-prefix-list");
+
+               pim_cmd_spt_switchover(pim, PIM_SPT_INFINITY,
+                                       prefix_list);
+               break;
+       case PIM_SPT_IMMEDIATE:
+               pim_cmd_spt_switchover(pim, PIM_SPT_IMMEDIATE, NULL);
+       }
+}
+
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/spt-switchover/spt-action
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_spt_switchover_spt_action_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_spt_switchover_spt_action_modify(
+       struct nb_cb_modify_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
@@ -615,28 +989,28 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_sp
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/spt-switchover/spt-infinity-prefix-list
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_spt_switchover_spt_infinity_prefix_list_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_spt_switchover_spt_infinity_prefix_list_modify(
+       struct nb_cb_modify_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_spt_switchover_spt_infinity_prefix_list_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_spt_switchover_spt_infinity_prefix_list_destroy(
+       struct nb_cb_destroy_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
@@ -646,28 +1020,56 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_sp
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/ssm-prefix-list
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ssm_prefix_list_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ssm_prefix_list_modify(
+       struct nb_cb_modify_args *args)
 {
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       const char *plist_name;
+       int result;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
+               break;
        case NB_EV_APPLY:
-               /* TODO: implement me. */
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               plist_name = yang_dnode_get_string(args->dnode, NULL);
+               result = pim_ssm_cmd_worker(pim, plist_name, args->errmsg,
+                               args->errmsg_len);
+
+               if (result)
+                       return NB_ERR_INCONSISTENCY;
+
                break;
        }
 
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ssm_prefix_list_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ssm_prefix_list_destroy(
+       struct nb_cb_destroy_args *args)
 {
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       int result;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
+               break;
        case NB_EV_APPLY:
-               /* TODO: implement me. */
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               result = pim_ssm_cmd_worker(pim, NULL, args->errmsg,
+                               args->errmsg_len);
+
+               if (result)
+                       return NB_ERR_INCONSISTENCY;
+
                break;
        }
 
@@ -677,28 +1079,68 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ss
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/ssm-pingd-source-ip
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ssm_pingd_source_ip_create(struct nb_cb_create_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ssm_pingd_source_ip_create(
+       struct nb_cb_create_args *args)
 {
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       int result;
+       struct ipaddr source_addr;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
-       case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
+       case NB_EV_APPLY:
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               yang_dnode_get_ip(&source_addr, args->dnode, NULL);
+               result = pim_ssmpingd_start(pim, source_addr.ip._v4_addr);
+               if (result) {
+                       char source_str[INET_ADDRSTRLEN];
+
+                       ipaddr2str(&source_addr, source_str,
+                                       sizeof(source_str));
+                       snprintf(args->errmsg, args->errmsg_len,
+                                "%% Failure starting ssmpingd for source %s: %d",
+                                source_str, result);
+                       return NB_ERR_INCONSISTENCY;
+               }
        }
 
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ssm_pingd_source_ip_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ssm_pingd_source_ip_destroy(
+       struct nb_cb_destroy_args *args)
 {
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       int result;
+       struct ipaddr source_addr;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
+               break;
        case NB_EV_APPLY:
-               /* TODO: implement me. */
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               yang_dnode_get_ip(&source_addr, args->dnode, NULL);
+               result = pim_ssmpingd_stop(pim, source_addr.ip._v4_addr);
+               if (result) {
+                       char source_str[INET_ADDRSTRLEN];
+
+                       ipaddr2str(&source_addr, source_str,
+                                  sizeof(source_str));
+                       snprintf(args->errmsg, args->errmsg_len,
+                                "%% Failure stopping ssmpingd for source %s: %d",
+                                 source_str, result);
+                       return NB_ERR_INCONSISTENCY;
+               }
+
                break;
        }
 
@@ -708,28 +1150,45 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ss
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp-mesh-group
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_create(struct nb_cb_create_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_create(
+       struct nb_cb_create_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_destroy(
+       struct nb_cb_destroy_args *args)
 {
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       const char *mesh_group_name;
+       int result;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
+               break;
        case NB_EV_APPLY:
-               /* TODO: implement me. */
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               mesh_group_name = yang_dnode_get_string(args->dnode, ".");
+
+               result = ip_no_msdp_mesh_group_cmd_worker(pim, mesh_group_name,
+                               args->errmsg,
+                               args->errmsg_len);
+
+               if (result != PIM_MSDP_ERR_NONE)
+                       return NB_ERR_INCONSISTENCY;
+
                break;
        }
 
@@ -739,28 +1198,48 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ms
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp-mesh-group/mesh-group-name
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_mesh_group_name_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_mesh_group_name_modify(
+       struct nb_cb_modify_args *args)
 {
+       const char *mesh_group_name;
+       const char *mesh_group_name_old;
+       char xpath[XPATH_MAXLEN];
+
        switch (args->event) {
        case NB_EV_VALIDATE:
+               mesh_group_name = yang_dnode_get_string(args->dnode, ".");
+               yang_dnode_get_path(args->dnode, xpath, sizeof(xpath));
+
+               if (yang_dnode_exists(running_config->dnode, xpath) == false)
+                       break;
+
+               mesh_group_name_old = yang_dnode_get_string(
+                                       running_config->dnode,
+                                       xpath);
+               if (strcmp(mesh_group_name, mesh_group_name_old)) {
+                       /* currently only one mesh-group can exist at a time */
+                       snprintf(args->errmsg, args->errmsg_len,
+                                "Only one mesh-group allowed currently");
+                       return NB_ERR_VALIDATION;
+               }
+               break;
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_mesh_group_name_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_mesh_group_name_destroy(
+       struct nb_cb_destroy_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
@@ -770,28 +1249,68 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ms
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp-mesh-group/member-ip
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_member_ip_create(struct nb_cb_create_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_member_ip_create(
+       struct nb_cb_create_args *args)
 {
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       const char *mesh_group_name;
+       struct ipaddr mbr_ip;
+       enum pim_msdp_err result;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
+               break;
        case NB_EV_APPLY:
-               /* TODO: implement me. */
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               mesh_group_name = yang_dnode_get_string(args->dnode,
+                               "../mesh-group-name");
+               yang_dnode_get_ip(&mbr_ip, args->dnode, NULL);
+
+               result = ip_msdp_mesh_group_member_cmd_worker(
+                               pim, mesh_group_name, mbr_ip.ip._v4_addr,
+                               args->errmsg, args->errmsg_len);
+
+               if (result != PIM_MSDP_ERR_NONE)
+                       return NB_ERR_INCONSISTENCY;
+
                break;
        }
 
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_member_ip_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_member_ip_destroy(
+       struct nb_cb_destroy_args *args)
 {
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       const char *mesh_group_name;
+       struct ipaddr mbr_ip;
+       enum pim_msdp_err result;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
+               break;
        case NB_EV_APPLY:
-               /* TODO: implement me. */
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               mesh_group_name = yang_dnode_get_string(args->dnode,
+                               "../mesh-group-name");
+               yang_dnode_get_ip(&mbr_ip, args->dnode, NULL);
+
+               result = ip_no_msdp_mesh_group_member_cmd_worker(
+                               pim, mesh_group_name, mbr_ip.ip._v4_addr,
+                               args->errmsg, args->errmsg_len);
+
+               if (result != PIM_MSDP_ERR_NONE)
+                       return NB_ERR_INCONSISTENCY;
+
                break;
        }
 
@@ -801,59 +1320,111 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ms
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp-mesh-group/source-ip
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_source_ip_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_source_ip_modify(
+       struct nb_cb_modify_args *args)
 {
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       const char *mesh_group_name;
+       struct ipaddr src_ip;
+       enum pim_msdp_err result;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
+               break;
        case NB_EV_APPLY:
-               /* TODO: implement me. */
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               mesh_group_name = yang_dnode_get_string(args->dnode,
+                               "../mesh-group-name");
+               yang_dnode_get_ip(&src_ip, args->dnode, NULL);
+
+               result = ip_msdp_mesh_group_source_cmd_worker(
+                               pim, mesh_group_name, src_ip.ip._v4_addr,
+                               args->errmsg, args->errmsg_len);
+
+               if (result != PIM_MSDP_ERR_NONE)
+                       return NB_ERR_INCONSISTENCY;
+
                break;
        }
-
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_source_ip_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_mesh_group_source_ip_destroy(
+       struct nb_cb_destroy_args *args)
 {
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       const char *mesh_group_name;
+       enum pim_msdp_err result;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
+               break;
        case NB_EV_APPLY:
-               /* TODO: implement me. */
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               mesh_group_name = yang_dnode_get_string(args->dnode,
+                               "../mesh-group-name");
+
+               result = ip_no_msdp_mesh_group_source_cmd_worker(
+                               pim, mesh_group_name, args->errmsg,
+                               args->errmsg_len);
+
+               if (result != PIM_MSDP_ERR_NONE)
+                       return NB_ERR_INCONSISTENCY;
+
                break;
        }
-
        return NB_OK;
 }
 
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp-peer
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_create(struct nb_cb_create_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_create(
+       struct nb_cb_create_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_destroy(
+       struct nb_cb_destroy_args *args)
 {
+       int result;
+       struct pim_instance *pim;
+       struct ipaddr peer_ip;
+       struct vrf *vrf;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
+               break;
        case NB_EV_APPLY:
-               /* TODO: implement me. */
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               yang_dnode_get_ip(&peer_ip, args->dnode, "./peer-ip");
+               result = ip_no_msdp_peer_cmd_worker(pim, peer_ip.ip._v4_addr,
+                               args->errmsg,
+                               args->errmsg_len);
+
+               if (result)
+                       return NB_ERR_INCONSISTENCY;
+
                break;
        }
 
@@ -863,28 +1434,67 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ms
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp-peer/source-ip
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_source_ip_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_source_ip_modify(
+       struct nb_cb_modify_args *args)
 {
-       switch (args->event) {
-       case NB_EV_VALIDATE:
+       int result;
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       struct ipaddr peer_ip;
+       struct ipaddr source_ip;
+       const struct lyd_node *mesh_group_name_dnode;
+       const char *mesh_group_name;
+
+       switch (args->event) {
+       case NB_EV_VALIDATE:
+               mesh_group_name_dnode =
+                       yang_dnode_get(args->dnode,
+                                       "../../msdp-mesh-group/mesh-group-name");
+               if (mesh_group_name_dnode) {
+                       mesh_group_name =
+                               yang_dnode_get_string(mesh_group_name_dnode,
+                                               ".");
+                       if (strcmp(mesh_group_name, "default")) {
+                               /* currently only one mesh-group can exist at a
+                                * time
+                                */
+                               snprintf(args->errmsg, args->errmsg_len,
+                                        "%% Only one mesh-group allowed currently");
+                               return NB_ERR_VALIDATION;
+                       }
+               }
+               break;
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
+               break;
        case NB_EV_APPLY:
-               /* TODO: implement me. */
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               yang_dnode_get_ip(&peer_ip, args->dnode, "../peer-ip");
+               yang_dnode_get_ip(&source_ip, args->dnode, NULL);
+
+               result = ip_msdp_peer_cmd_worker(pim, peer_ip.ip._v4_addr,
+                               source_ip.ip._v4_addr,
+                               args->errmsg,
+                               args->errmsg_len);
+
+               if (result)
+                       return NB_ERR_INCONSISTENCY;
+
                break;
        }
 
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_source_ip_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_source_ip_destroy(
+       struct nb_cb_destroy_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
@@ -894,59 +1504,94 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ms
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/mlag
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_create(struct nb_cb_create_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_create(
+       struct nb_cb_create_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_destroy(
+       struct nb_cb_destroy_args *args)
 {
+       struct in_addr addr;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
-       case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
+       case NB_EV_APPLY:
+               addr.s_addr = 0;
+               pim_vxlan_mlag_update(true/*mlag_enable*/,
+                               false/*peer_state*/, MLAG_ROLE_NONE,
+                               NULL/*peerlink*/, &addr);
        }
 
        return NB_OK;
 }
 
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/mlag
+ */
+void routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_apply_finish(
+       struct nb_cb_apply_finish_args *args)
+{
+       const char *ifname;
+       uint32_t role;
+       bool peer_state;
+       struct interface *ifp;
+       struct ipaddr reg_addr;
+
+       ifname = yang_dnode_get_string(args->dnode, "./peerlink-rif");
+       ifp = if_lookup_by_name(ifname, VRF_DEFAULT);
+       if (!ifp) {
+               snprintf(args->errmsg, args->errmsg_len,
+                        "No such interface name %s", ifname);
+               return;
+       }
+       role = yang_dnode_get_enum(args->dnode, "./my-role");
+       peer_state = yang_dnode_get_bool(args->dnode, "./peer-state");
+       yang_dnode_get_ip(&reg_addr, args->dnode, "./reg-address");
+
+       pim_vxlan_mlag_update(true, peer_state, role, ifp,
+                       &reg_addr.ip._v4_addr);
+}
+
+
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/mlag/peerlink-rif
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_peerlink_rif_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_peerlink_rif_modify(
+       struct nb_cb_modify_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_peerlink_rif_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_peerlink_rif_destroy(
+       struct nb_cb_destroy_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
@@ -956,28 +1601,28 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ml
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/mlag/reg-address
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_reg_address_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_reg_address_modify(
+       struct nb_cb_modify_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_reg_address_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_reg_address_destroy(
+       struct nb_cb_destroy_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
@@ -987,14 +1632,14 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ml
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/mlag/my-role
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_my_role_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_my_role_modify(
+       struct nb_cb_modify_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
@@ -1004,14 +1649,14 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ml
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/mlag/peer-state
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_peer_state_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_peer_state_modify(
+       struct nb_cb_modify_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
        case NB_EV_APPLY:
-               /* TODO: implement me. */
                break;
        }
 
@@ -1021,28 +1666,48 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ml
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/register-accept-list
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_register_accept_list_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_register_accept_list_modify(
+       struct nb_cb_modify_args *args)
 {
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       const char *plist;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
+               break;
        case NB_EV_APPLY:
-               /* TODO: implement me. */
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               plist = yang_dnode_get_string(args->dnode, NULL);
+
+               XFREE(MTYPE_PIM_PLIST_NAME, pim->register_plist);
+               pim->register_plist = XSTRDUP(MTYPE_PIM_PLIST_NAME, plist);
+
                break;
        }
 
        return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_register_accept_list_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_register_accept_list_destroy(
+       struct nb_cb_destroy_args *args)
 {
+       struct vrf *vrf;
+       struct pim_instance *pim;
+
        switch (args->event) {
        case NB_EV_VALIDATE:
        case NB_EV_PREPARE:
        case NB_EV_ABORT:
+               break;
        case NB_EV_APPLY:
-               /* TODO: implement me. */
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+
+               XFREE(MTYPE_PIM_PLIST_NAME, pim->register_plist);
                break;
        }
 
@@ -1352,18 +2017,18 @@ int lib_interface_pim_bsm_modify(struct nb_cb_modify_args *args)
 
        switch (args->event) {
        case NB_EV_VALIDATE:
-        case NB_EV_PREPARE:
-        case NB_EV_ABORT:
-                break;
-        case NB_EV_APPLY:
-                ifp = nb_running_get_entry(args->dnode, NULL, true);
-                pim_ifp = ifp->info;
-                pim_ifp->bsm_enable = yang_dnode_get_bool(args->dnode, NULL);
+       case NB_EV_PREPARE:
+       case NB_EV_ABORT:
+               break;
+       case NB_EV_APPLY:
+               ifp = nb_running_get_entry(args->dnode, NULL, true);
+               pim_ifp = ifp->info;
+               pim_ifp->bsm_enable = yang_dnode_get_bool(args->dnode, NULL);
 
-                break;
-        }
+               break;
+       }
 
-        return NB_OK;
+       return NB_OK;
 }
 
 /*
@@ -1535,7 +2200,8 @@ int lib_interface_pim_address_family_use_source_modify(struct nb_cb_modify_args
        return NB_OK;
 }
 
-int lib_interface_pim_address_family_use_source_destroy(struct nb_cb_destroy_args *args)
+int lib_interface_pim_address_family_use_source_destroy(
+       struct nb_cb_destroy_args *args)
 {
        struct interface *ifp;
        struct in_addr source_addr = {INADDR_ANY};
@@ -1573,7 +2239,8 @@ int lib_interface_pim_address_family_use_source_destroy(struct nb_cb_destroy_arg
 /*
  * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/multicast-boundary-oil
  */
-int lib_interface_pim_address_family_multicast_boundary_oil_modify(struct nb_cb_modify_args *args)
+int lib_interface_pim_address_family_multicast_boundary_oil_modify(
+       struct nb_cb_modify_args *args)
 {
        struct interface *ifp;
        struct pim_interface *pim_ifp;
@@ -1609,7 +2276,8 @@ int lib_interface_pim_address_family_multicast_boundary_oil_modify(struct nb_cb_
        return NB_OK;
 }
 
-int lib_interface_pim_address_family_multicast_boundary_oil_destroy(struct nb_cb_destroy_args *args)
+int lib_interface_pim_address_family_multicast_boundary_oil_destroy(
+       struct nb_cb_destroy_args *args)
 {
        struct interface *ifp;
        struct pim_interface *pim_ifp;
@@ -1620,7 +2288,7 @@ int lib_interface_pim_address_family_multicast_boundary_oil_destroy(struct nb_cb
                if_dnode = yang_dnode_get_parent(args->dnode, "interface");
                if (!is_pim_interface(if_dnode)) {
                        snprintf(args->errmsg, args->errmsg_len,
-                                       "%% Enable PIM and/or IGMP on this interface first");
+                                "%% Enable PIM and/or IGMP on this interface first");
                        return NB_ERR_VALIDATION;
                }
                break;
@@ -1641,7 +2309,8 @@ int lib_interface_pim_address_family_multicast_boundary_oil_destroy(struct nb_cb
 /*
  * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/mroute
  */
-int lib_interface_pim_address_family_mroute_create(struct nb_cb_create_args *args)
+int lib_interface_pim_address_family_mroute_create(
+       struct nb_cb_create_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
@@ -1654,7 +2323,8 @@ int lib_interface_pim_address_family_mroute_create(struct nb_cb_create_args *arg
        return NB_OK;
 }
 
-int lib_interface_pim_address_family_mroute_destroy(struct nb_cb_destroy_args *args)
+int lib_interface_pim_address_family_mroute_destroy(
+       struct nb_cb_destroy_args *args)
 {
        struct pim_instance *pim;
        struct pim_interface *pim_iifp;
@@ -1670,7 +2340,7 @@ int lib_interface_pim_address_family_mroute_destroy(struct nb_cb_destroy_args *a
                if_dnode = yang_dnode_get_parent(args->dnode, "interface");
                if (!is_pim_interface(if_dnode)) {
                        snprintf(args->errmsg, args->errmsg_len,
-                                       "%% Enable PIM and/or IGMP on this interface first");
+                                "%% Enable PIM and/or IGMP on this interface first");
                        return NB_ERR_VALIDATION;
                }
                break;
@@ -1711,7 +2381,8 @@ int lib_interface_pim_address_family_mroute_destroy(struct nb_cb_destroy_args *a
 /*
  * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/mroute/oif
  */
-int lib_interface_pim_address_family_mroute_oif_modify(struct nb_cb_modify_args *args)
+int lib_interface_pim_address_family_mroute_oif_modify(
+       struct nb_cb_modify_args *args)
 {
        struct pim_instance *pim;
        struct pim_interface *pim_iifp;
@@ -1727,7 +2398,7 @@ int lib_interface_pim_address_family_mroute_oif_modify(struct nb_cb_modify_args
                if_dnode = yang_dnode_get_parent(args->dnode, "interface");
                if (!is_pim_interface(if_dnode)) {
                        snprintf(args->errmsg, args->errmsg_len,
-                                       "%% Enable PIM and/or IGMP on this interface first");
+                                "%% Enable PIM and/or IGMP on this interface first");
                        return NB_ERR_VALIDATION;
                }
                break;
@@ -1744,8 +2415,8 @@ int lib_interface_pim_address_family_mroute_oif_modify(struct nb_cb_modify_args
 
                if (!oif) {
                        snprintf(args->errmsg, args->errmsg_len,
-                                       "No such interface name %s",
-                                       oifname);
+                                "No such interface name %s",
+                                oifname);
                        return NB_ERR_INCONSISTENCY;
                }
 
@@ -1753,9 +2424,9 @@ int lib_interface_pim_address_family_mroute_oif_modify(struct nb_cb_modify_args
                yang_dnode_get_ip(&group_addr, args->dnode, "../group-addr");
 
                if (pim_static_add(pim, iif, oif, group_addr.ip._v4_addr,
-                                       source_addr.ip._v4_addr)) {
+                                  source_addr.ip._v4_addr)) {
                        snprintf(args->errmsg, args->errmsg_len,
-                                       "Failed to add static mroute");
+                                "Failed to add static mroute");
                        return NB_ERR_INCONSISTENCY;
                }
 
@@ -1765,7 +2436,8 @@ int lib_interface_pim_address_family_mroute_oif_modify(struct nb_cb_modify_args
        return NB_OK;
 }
 
-int lib_interface_pim_address_family_mroute_oif_destroy(struct nb_cb_destroy_args *args)
+int lib_interface_pim_address_family_mroute_oif_destroy(
+       struct nb_cb_destroy_args *args)
 {
        switch (args->event) {
        case NB_EV_VALIDATE:
@@ -1781,94 +2453,196 @@ int lib_interface_pim_address_family_mroute_oif_destroy(struct nb_cb_destroy_arg
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/frr-pim-rp:rp/static-rp/rp-list
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_create(struct nb_cb_create_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_create(
+       struct nb_cb_create_args *args)
 {
-        switch (args->event) {
-        case NB_EV_VALIDATE:
-        case NB_EV_PREPARE:
-        case NB_EV_ABORT:
-        case NB_EV_APPLY:
-                /* TODO: implement me. */
-                break;
-        }
+       switch (args->event) {
+       case NB_EV_VALIDATE:
+       case NB_EV_PREPARE:
+       case NB_EV_ABORT:
+       case NB_EV_APPLY:
+               break;
+       }
 
-        return NB_OK;
+       return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_destroy(
+       struct nb_cb_destroy_args *args)
 {
-        switch (args->event) {
-        case NB_EV_VALIDATE:
-        case NB_EV_PREPARE:
-        case NB_EV_ABORT:
-        case NB_EV_APPLY:
-                /* TODO: implement me. */
-                break;
-        }
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       struct prefix group;
+       struct ipaddr rp_addr;
+       const char *plist;
+       int result = 0;
+
+       switch (args->event) {
+       case NB_EV_VALIDATE:
+       case NB_EV_PREPARE:
+       case NB_EV_ABORT:
+               break;
+       case NB_EV_APPLY:
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               yang_dnode_get_ip(&rp_addr, args->dnode, "./rp-address");
+
+               if (yang_dnode_get(args->dnode, "./group-list")) {
+                       yang_dnode_get_ipv4p(&group, args->dnode,
+                                       "./group-list");
+                       apply_mask_ipv4((struct prefix_ipv4 *)&group);
+                       result = pim_no_rp_cmd_worker(pim, rp_addr.ip._v4_addr,
+                                       group, NULL, args->errmsg,
+                                       args->errmsg_len);
+               }
+
+               else if (yang_dnode_get(args->dnode, "./prefix-list")) {
+                       plist = yang_dnode_get_string(args->dnode,
+                                       "./prefix-list");
+                       if (!str2prefix("224.0.0.0/4", &group)) {
+                               flog_err(
+                                       EC_LIB_DEVELOPMENT,
+                                       "Unable to convert 224.0.0.0/4 to prefix");
+                               return NB_ERR_INCONSISTENCY;
+                       }
+
+                       result = pim_no_rp_cmd_worker(pim, rp_addr.ip._v4_addr,
+                                       group, plist,
+                                       args->errmsg,
+                                       args->errmsg_len);
+               }
+
+               if (result)
+                       return NB_ERR_INCONSISTENCY;
+               break;
+       }
 
-        return NB_OK;
+       return NB_OK;
 }
 
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/frr-pim-rp:rp/static-rp/rp-list/group-list
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_group_list_create(struct nb_cb_create_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_group_list_create(
+       struct nb_cb_create_args *args)
 {
-        switch (args->event) {
-        case NB_EV_VALIDATE:
-        case NB_EV_PREPARE:
-        case NB_EV_ABORT:
-        case NB_EV_APPLY:
-                /* TODO: implement me. */
-                break;
-        }
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       struct prefix group;
+       struct ipaddr rp_addr;
+
+       switch (args->event) {
+       case NB_EV_VALIDATE:
+       case NB_EV_PREPARE:
+       case NB_EV_ABORT:
+               break;
+       case NB_EV_APPLY:
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               yang_dnode_get_ip(&rp_addr, args->dnode, "../rp-address");
+               yang_dnode_get_ipv4p(&group, args->dnode, NULL);
+               apply_mask_ipv4((struct prefix_ipv4 *)&group);
 
-        return NB_OK;
+               return pim_rp_cmd_worker(pim, rp_addr.ip._v4_addr, group,
+                               NULL, args->errmsg, args->errmsg_len);
+       }
+
+       return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_group_list_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_group_list_destroy(
+       struct nb_cb_destroy_args *args)
 {
-        switch (args->event) {
-        case NB_EV_VALIDATE:
-        case NB_EV_PREPARE:
-        case NB_EV_ABORT:
-        case NB_EV_APPLY:
-                /* TODO: implement me. */
-                break;
-        }
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       struct prefix group;
+       struct ipaddr rp_addr;
+
+       switch (args->event) {
+       case NB_EV_VALIDATE:
+       case NB_EV_PREPARE:
+       case NB_EV_ABORT:
+               break;
+       case NB_EV_APPLY:
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               yang_dnode_get_ip(&rp_addr, args->dnode, "../rp-address");
+               yang_dnode_get_ipv4p(&group, args->dnode, NULL);
+               apply_mask_ipv4((struct prefix_ipv4 *)&group);
+
+               return pim_no_rp_cmd_worker(pim, rp_addr.ip._v4_addr, group,
+                               NULL, args->errmsg,
+                               args->errmsg_len);
+       }
 
-        return NB_OK;
+       return NB_OK;
 }
 
 /*
  * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/frr-pim-rp:rp/static-rp/rp-list/prefix-list
  */
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_prefix_list_modify(struct nb_cb_modify_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_prefix_list_modify(
+       struct nb_cb_modify_args *args)
 {
-        switch (args->event) {
-        case NB_EV_VALIDATE:
-        case NB_EV_PREPARE:
-        case NB_EV_ABORT:
-        case NB_EV_APPLY:
-                /* TODO: implement me. */
-                break;
-        }
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       struct prefix group;
+       struct ipaddr rp_addr;
+       const char *plist;
+
+       switch (args->event) {
+       case NB_EV_VALIDATE:
+       case NB_EV_PREPARE:
+       case NB_EV_ABORT:
+               break;
+       case NB_EV_APPLY:
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               plist = yang_dnode_get_string(args->dnode, NULL);
+               yang_dnode_get_ip(&rp_addr, args->dnode, "../rp-address");
+               if (!str2prefix("224.0.0.0/4", &group)) {
+                       flog_err(EC_LIB_DEVELOPMENT,
+                                "Unable to convert 224.0.0.0/4 to prefix");
+                       return NB_ERR_INCONSISTENCY;
+               }
+               return pim_rp_cmd_worker(pim, rp_addr.ip._v4_addr, group,
+                               plist, args->errmsg, args->errmsg_len);
+       }
 
-        return NB_OK;
+       return NB_OK;
 }
 
-int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_prefix_list_destroy(struct nb_cb_destroy_args *args)
+int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_prefix_list_destroy(
+       struct nb_cb_destroy_args *args)
 {
-        switch (args->event) {
-        case NB_EV_VALIDATE:
-        case NB_EV_PREPARE:
-        case NB_EV_ABORT:
-        case NB_EV_APPLY:
-                /* TODO: implement me. */
-                break;
-        }
+       struct vrf *vrf;
+       struct pim_instance *pim;
+       struct prefix group;
+       struct ipaddr rp_addr;
+       const char *plist;
+
+       switch (args->event) {
+       case NB_EV_VALIDATE:
+       case NB_EV_PREPARE:
+       case NB_EV_ABORT:
+               break;
+       case NB_EV_APPLY:
+               vrf = nb_running_get_entry(args->dnode, NULL, true);
+               pim = vrf->info;
+               yang_dnode_get_ip(&rp_addr, args->dnode, "../rp-address");
+               plist = yang_dnode_get_string(args->dnode, NULL);
+               if (!str2prefix("224.0.0.0/4", &group)) {
+                       flog_err(EC_LIB_DEVELOPMENT,
+                                "Unable to convert 224.0.0.0/4 to prefix");
+                       return NB_ERR_INCONSISTENCY;
+               }
+               return pim_no_rp_cmd_worker(pim, rp_addr.ip._v4_addr, group,
+                               plist, args->errmsg,
+                               args->errmsg_len);
+               break;
+       }
 
-        return NB_OK;
+       return NB_OK;
 }
 
 /*
@@ -1938,8 +2712,8 @@ int lib_interface_igmp_igmp_enable_modify(struct nb_cb_modify_args *args)
                /* Limiting mcast interfaces to number of VIFs */
                if (mcast_if_count == MAXVIFS) {
                        snprintf(args->errmsg, args->errmsg_len,
-                                       "Max multicast interfaces(%d) Reached. Could not enable IGMP on interface %s",
-                                       MAXVIFS, ifp_name);
+                                "Max multicast interfaces(%d) Reached. Could not enable IGMP on interface %s",
+                                MAXVIFS, ifp_name);
                        return NB_ERR_VALIDATION;
                }
                break;
@@ -1998,8 +2772,6 @@ int lib_interface_igmp_version_modify(struct nb_cb_modify_args *args)
                old_version = pim_ifp->igmp_version;
                pim_ifp->igmp_version = igmp_version;
 
-               old_version = igmp_version;
-
                /* Current and new version is different refresh existing
                 * membership. Going from 3 -> 2 or 2 -> 3.
                 */
@@ -2055,9 +2827,9 @@ int lib_interface_igmp_query_interval_modify(struct nb_cb_modify_args *args)
                if (query_interval_dsec <=
                                pim_ifp->igmp_query_max_response_time_dsec) {
                        snprintf(args->errmsg, args->errmsg_len,
-                                       "Can't set general query interval %d dsec <= query max response time %d dsec.",
-                                       query_interval_dsec,
-                                       pim_ifp->igmp_query_max_response_time_dsec);
+                                "Can't set general query interval %d dsec <= query max response time %d dsec.",
+                                query_interval_dsec,
+                                pim_ifp->igmp_query_max_response_time_dsec);
                        return NB_ERR_INCONSISTENCY;
                }
                change_query_interval(pim_ifp, query_interval);
@@ -2069,7 +2841,8 @@ int lib_interface_igmp_query_interval_modify(struct nb_cb_modify_args *args)
 /*
  * XPath: /frr-interface:lib/interface/frr-igmp:igmp/query-max-response-time
  */
-int lib_interface_igmp_query_max_response_time_modify(struct nb_cb_modify_args *args)
+int lib_interface_igmp_query_max_response_time_modify(
+       struct nb_cb_modify_args *args)
 {
        struct interface *ifp;
        struct pim_interface *pim_ifp;
@@ -2090,11 +2863,11 @@ int lib_interface_igmp_query_max_response_time_modify(struct nb_cb_modify_args *
                        10 * pim_ifp->igmp_default_query_interval;
 
                if (query_max_response_time_dsec
-                               >= default_query_interval_dsec) {
+                       >= default_query_interval_dsec) {
                        snprintf(args->errmsg, args->errmsg_len,
-                                       "Can't set query max response time %d sec >= general query interval %d sec",
-                                       query_max_response_time_dsec,
-                                       pim_ifp->igmp_default_query_interval);
+                                "Can't set query max response time %d sec >= general query interval %d sec",
+                                query_max_response_time_dsec,
+                                pim_ifp->igmp_default_query_interval);
                        return NB_ERR_INCONSISTENCY;
                }
 
@@ -2108,7 +2881,8 @@ int lib_interface_igmp_query_max_response_time_modify(struct nb_cb_modify_args *
 /*
  * XPath: /frr-interface:lib/interface/frr-igmp:igmp/last-member-query-interval
  */
-int lib_interface_igmp_last_member_query_interval_modify(struct nb_cb_modify_args *args)
+int lib_interface_igmp_last_member_query_interval_modify(
+       struct nb_cb_modify_args *args)
 {
        struct interface *ifp;
        struct pim_interface *pim_ifp;
@@ -2136,7 +2910,8 @@ int lib_interface_igmp_last_member_query_interval_modify(struct nb_cb_modify_arg
 /*
  * XPath: /frr-interface:lib/interface/frr-igmp:igmp/robustness-variable
  */
-int lib_interface_igmp_robustness_variable_modify(struct nb_cb_modify_args *args)
+int lib_interface_igmp_robustness_variable_modify(
+       struct nb_cb_modify_args *args)
 {
        struct interface *ifp;
        struct pim_interface *pim_ifp;
@@ -2192,7 +2967,8 @@ int lib_interface_igmp_address_family_destroy(struct nb_cb_destroy_args *args)
 /*
  * XPath: /frr-interface:lib/interface/frr-igmp:igmp/address-family/static-group
  */
-int lib_interface_igmp_address_family_static_group_create(struct nb_cb_create_args *args)
+int lib_interface_igmp_address_family_static_group_create(
+       struct nb_cb_create_args *args)
 {
        struct interface *ifp;
        struct ipaddr source_addr;
@@ -2207,8 +2983,8 @@ int lib_interface_igmp_address_family_static_group_create(struct nb_cb_create_ar
                if (!is_pim_interface(if_dnode)) {
                        ifp_name = yang_dnode_get_string(if_dnode, ".");
                        snprintf(args->errmsg, args->errmsg_len,
-                                       "multicast not enabled on interface %s",
-                                       ifp_name);
+                                "multicast not enabled on interface %s",
+                                ifp_name);
                        return NB_ERR_VALIDATION;
                }
                break;
@@ -2224,7 +3000,7 @@ int lib_interface_igmp_address_family_static_group_create(struct nb_cb_create_ar
                                source_addr.ip._v4_addr);
                if (result) {
                        snprintf(args->errmsg, args->errmsg_len,
-                                       "Failure joining IGMP group");
+                                "Failure joining IGMP group");
                        return NB_ERR_INCONSISTENCY;
                }
        }
@@ -2232,7 +3008,8 @@ int lib_interface_igmp_address_family_static_group_create(struct nb_cb_create_ar
        return NB_OK;
 }
 
-int lib_interface_igmp_address_family_static_group_destroy(struct nb_cb_destroy_args *args)
+int lib_interface_igmp_address_family_static_group_destroy(
+       struct nb_cb_destroy_args *args)
 {
        struct interface *ifp;
        struct ipaddr source_addr;
@@ -2260,8 +3037,8 @@ int lib_interface_igmp_address_family_static_group_destroy(struct nb_cb_destroy_
                        ipaddr2str(&group_addr, grp_str, sizeof(grp_str));
 
                        snprintf(args->errmsg, args->errmsg_len,
-                                       "%% Failure leaving IGMP group %s %s on interface %s: %d",
-                                       src_str, grp_str, ifp->name, result);
+                                "%% Failure leaving IGMP group %s %s on interface %s: %d",
+                                src_str, grp_str, ifp->name, result);
 
                        return NB_ERR_INCONSISTENCY;
                }