]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_cmd.c
Merge pull request #9682 from adrianomarto/mesh-group-fix
[mirror_frr.git] / pimd / pim_cmd.c
index 812c8c1449ec0ab995ac5a18e21b316e903b2154..4cd94e0df9ac8baecc3a7030633094b19d19e02a 100644 (file)
@@ -3430,112 +3430,87 @@ static void igmp_show_groups(struct pim_instance *pim, struct vty *vty, bool uj)
                        pim->igmp_watermark_limit ? "Set" : "Not Set",
                        pim->igmp_watermark_limit);
                vty_out(vty,
-                       "Interface        Address         Group           Mode Timer    Srcs V Uptime  \n");
+                       "Interface        Group           Mode Timer    Srcs V Uptime  \n");
        }
 
        /* scan interfaces */
        FOR_ALL_INTERFACES (pim->vrf, ifp) {
                struct pim_interface *pim_ifp = ifp->info;
-               struct listnode *sock_node;
-               struct igmp_sock *igmp;
+               struct listnode *grpnode;
+               struct igmp_group *grp;
 
                if (!pim_ifp)
                        continue;
 
-               /* scan igmp sockets */
-               for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node,
-                                         igmp)) {
-                       char ifaddr_str[INET_ADDRSTRLEN];
-                       struct listnode *grpnode;
-                       struct igmp_group *grp;
-
-                       pim_inet4_dump("<ifaddr?>", igmp->ifaddr, ifaddr_str,
-                                      sizeof(ifaddr_str));
-
-                       /* scan igmp groups */
-                       for (ALL_LIST_ELEMENTS_RO(igmp->igmp_group_list,
-                                                 grpnode, grp)) {
-                               char group_str[INET_ADDRSTRLEN];
-                               char hhmmss[10];
-                               char uptime[10];
+               /* scan igmp groups */
+               for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode,
+                                         grp)) {
+                       char group_str[INET_ADDRSTRLEN];
+                       char hhmmss[10];
+                       char uptime[10];
 
-                               pim_inet4_dump("<group?>", grp->group_addr,
-                                              group_str, sizeof(group_str));
-                               pim_time_timer_to_hhmmss(hhmmss, sizeof(hhmmss),
-                                                        grp->t_group_timer);
-                               pim_time_uptime(uptime, sizeof(uptime),
-                                               now - grp->group_creation);
+                       pim_inet4_dump("<group?>", grp->group_addr, group_str,
+                                      sizeof(group_str));
+                       pim_time_timer_to_hhmmss(hhmmss, sizeof(hhmmss),
+                                                grp->t_group_timer);
+                       pim_time_uptime(uptime, sizeof(uptime),
+                                       now - grp->group_creation);
 
-                               if (uj) {
-                                       json_object_object_get_ex(
-                                               json, ifp->name, &json_iface);
-
-                                       if (!json_iface) {
-                                               json_iface =
-                                                       json_object_new_object();
-                                               json_object_pim_ifp_add(
-                                                       json_iface, ifp);
-                                               json_object_object_add(
-                                                       json, ifp->name,
-                                                       json_iface);
-                                               json_groups =
-                                                       json_object_new_array();
-                                               json_object_object_add(
-                                                       json_iface,
-                                                       "groups",
-                                                       json_groups);
-                                       }
+                       if (uj) {
+                               json_object_object_get_ex(json, ifp->name,
+                                                         &json_iface);
 
-                                       json_group = json_object_new_object();
-                                       json_object_string_add(json_group,
-                                                              "source",
-                                                              ifaddr_str);
-                                       json_object_string_add(json_group,
-                                                              "group",
-                                                              group_str);
-
-                                       if (grp->igmp_version == 3)
-                                               json_object_string_add(
-                                                       json_group, "mode",
-                                                       grp->group_filtermode_isexcl
+                               if (!json_iface) {
+                                       json_iface = json_object_new_object();
+                                       json_object_pim_ifp_add(json_iface,
+                                                               ifp);
+                                       json_object_object_add(json, ifp->name,
+                                                              json_iface);
+                                       json_groups = json_object_new_array();
+                                       json_object_object_add(json_iface,
+                                                              "groups",
+                                                              json_groups);
+                               }
+
+                               json_group = json_object_new_object();
+                               json_object_string_add(json_group, "group",
+                                                      group_str);
+
+                               if (grp->igmp_version == 3)
+                                       json_object_string_add(
+                                               json_group, "mode",
+                                               grp->group_filtermode_isexcl
                                                        ? "EXCLUDE"
                                                        : "INCLUDE");
 
-                                       json_object_string_add(json_group,
-                                                              "timer", hhmmss);
-                                       json_object_int_add(
-                                               json_group, "sourcesCount",
-                                               grp->group_source_list
-                                               ? listcount(
-                                                       grp->group_source_list)
-                                               : 0);
-                                       json_object_int_add(
-                                               json_group, "version",
-                                               grp->igmp_version);
-                                       json_object_string_add(
-                                               json_group, "uptime", uptime);
-                                       json_object_array_add(json_groups,
-                                                             json_group);
-                               } else {
-                                       vty_out(vty,
-                                               "%-16s %-15s %-15s %4s %8s %4d %d %8s\n",
-                                               ifp->name, ifaddr_str,
-                                               group_str,
-                                               grp->igmp_version == 3
+                               json_object_string_add(json_group, "timer",
+                                                      hhmmss);
+                               json_object_int_add(
+                                       json_group, "sourcesCount",
+                                       grp->group_source_list ? listcount(
+                                               grp->group_source_list)
+                                                              : 0);
+                               json_object_int_add(json_group, "version",
+                                                   grp->igmp_version);
+                               json_object_string_add(json_group, "uptime",
+                                                      uptime);
+                               json_object_array_add(json_groups, json_group);
+                       } else {
+                               vty_out(vty, "%-16s %-15s %4s %8s %4d %d %8s\n",
+                                       ifp->name, group_str,
+                                       grp->igmp_version == 3
                                                ? (grp->group_filtermode_isexcl
-                                                  ? "EXCL"
-                                                  : "INCL")
+                                                          ? "EXCL"
+                                                          : "INCL")
                                                : "----",
-                                               hhmmss,
-                                               grp->group_source_list
-                                               ? listcount(
-                                                       grp->group_source_list)
-                                               : 0,
-                                               grp->igmp_version, uptime);
-                               }
-                       } /* scan igmp groups */
-               }        /* scan igmp sockets */
-       }                 /* scan interfaces */
+                                       hhmmss,
+                                       grp->group_source_list ? listcount(
+                                               grp->group_source_list)
+                                                              : 0,
+                                       grp->igmp_version, uptime);
+                       }
+               } /* scan igmp groups */
+       }         /* scan interfaces */
 
        if (uj) {
                vty_out(vty, "%s\n", json_object_to_json_string_ext(
@@ -3550,63 +3525,49 @@ static void igmp_show_group_retransmission(struct pim_instance *pim,
        struct interface *ifp;
 
        vty_out(vty,
-               "Interface        Address         Group           RetTimer Counter RetSrcs\n");
+               "Interface        Group           RetTimer Counter RetSrcs\n");
 
        /* scan interfaces */
        FOR_ALL_INTERFACES (pim->vrf, ifp) {
                struct pim_interface *pim_ifp = ifp->info;
-               struct listnode *sock_node;
-               struct igmp_sock *igmp;
+               struct listnode *grpnode;
+               struct igmp_group *grp;
 
                if (!pim_ifp)
                        continue;
 
-               /* scan igmp sockets */
-               for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node,
-                                         igmp)) {
-                       char ifaddr_str[INET_ADDRSTRLEN];
-                       struct listnode *grpnode;
-                       struct igmp_group *grp;
-
-                       pim_inet4_dump("<ifaddr?>", igmp->ifaddr, ifaddr_str,
-                                      sizeof(ifaddr_str));
-
-                       /* scan igmp groups */
-                       for (ALL_LIST_ELEMENTS_RO(igmp->igmp_group_list,
-                                                 grpnode, grp)) {
-                               char group_str[INET_ADDRSTRLEN];
-                               char grp_retr_mmss[10];
-                               struct listnode *src_node;
-                               struct igmp_source *src;
-                               int grp_retr_sources = 0;
-
-                               pim_inet4_dump("<group?>", grp->group_addr,
-                                              group_str, sizeof(group_str));
-                               pim_time_timer_to_mmss(
-                                       grp_retr_mmss, sizeof(grp_retr_mmss),
-                                       grp->t_group_query_retransmit_timer);
-
-
-                               /* count group sources with retransmission state
-                                */
-                               for (ALL_LIST_ELEMENTS_RO(
-                                            grp->group_source_list, src_node,
-                                            src)) {
-                                       if (src->source_query_retransmit_count
-                                           > 0) {
-                                               ++grp_retr_sources;
-                                       }
+               /* scan igmp groups */
+               for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode,
+                                         grp)) {
+                       char group_str[INET_ADDRSTRLEN];
+                       char grp_retr_mmss[10];
+                       struct listnode *src_node;
+                       struct igmp_source *src;
+                       int grp_retr_sources = 0;
+
+                       pim_inet4_dump("<group?>", grp->group_addr, group_str,
+                                      sizeof(group_str));
+                       pim_time_timer_to_mmss(
+                               grp_retr_mmss, sizeof(grp_retr_mmss),
+                               grp->t_group_query_retransmit_timer);
+
+
+                       /* count group sources with retransmission state
+                        */
+                       for (ALL_LIST_ELEMENTS_RO(grp->group_source_list,
+                                                 src_node, src)) {
+                               if (src->source_query_retransmit_count > 0) {
+                                       ++grp_retr_sources;
                                }
+                       }
 
-                               vty_out(vty, "%-16s %-15s %-15s %-8s %7d %7d\n",
-                                       ifp->name, ifaddr_str, group_str,
-                                       grp_retr_mmss,
-                                       grp->group_specific_query_retransmit_count,
-                                       grp_retr_sources);
+                       vty_out(vty, "%-16s %-15s %-8s %7d %7d\n", ifp->name,
+                               group_str, grp_retr_mmss,
+                               grp->group_specific_query_retransmit_count,
+                               grp_retr_sources);
 
-                       } /* scan igmp groups */
-               }        /* scan igmp sockets */
-       }                 /* scan interfaces */
+               } /* scan igmp groups */
+       }         /* scan interfaces */
 }
 
 static void igmp_show_sources(struct pim_instance *pim, struct vty *vty)
@@ -3617,71 +3578,54 @@ static void igmp_show_sources(struct pim_instance *pim, struct vty *vty)
        now = pim_time_monotonic_sec();
 
        vty_out(vty,
-               "Interface        Address         Group           Source          Timer Fwd Uptime  \n");
+               "Interface        Group           Source          Timer Fwd Uptime  \n");
 
        /* scan interfaces */
        FOR_ALL_INTERFACES (pim->vrf, ifp) {
                struct pim_interface *pim_ifp = ifp->info;
-               struct listnode *sock_node;
-               struct igmp_sock *igmp;
+               struct listnode *grpnode;
+               struct igmp_group *grp;
 
                if (!pim_ifp)
                        continue;
 
-               /* scan igmp sockets */
-               for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node,
-                                         igmp)) {
-                       char ifaddr_str[INET_ADDRSTRLEN];
-                       struct listnode *grpnode;
-                       struct igmp_group *grp;
+               /* scan igmp groups */
+               for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode,
+                                         grp)) {
+                       char group_str[INET_ADDRSTRLEN];
+                       struct listnode *srcnode;
+                       struct igmp_source *src;
 
-                       pim_inet4_dump("<ifaddr?>", igmp->ifaddr, ifaddr_str,
-                                      sizeof(ifaddr_str));
+                       pim_inet4_dump("<group?>", grp->group_addr, group_str,
+                                      sizeof(group_str));
 
-                       /* scan igmp groups */
-                       for (ALL_LIST_ELEMENTS_RO(igmp->igmp_group_list,
-                                                 grpnode, grp)) {
-                               char group_str[INET_ADDRSTRLEN];
-                               struct listnode *srcnode;
-                               struct igmp_source *src;
+                       /* scan group sources */
+                       for (ALL_LIST_ELEMENTS_RO(grp->group_source_list,
+                                                 srcnode, src)) {
+                               char source_str[INET_ADDRSTRLEN];
+                               char mmss[10];
+                               char uptime[10];
 
-                               pim_inet4_dump("<group?>", grp->group_addr,
-                                              group_str, sizeof(group_str));
+                               pim_inet4_dump("<source?>", src->source_addr,
+                                              source_str, sizeof(source_str));
 
-                               /* scan group sources */
-                               for (ALL_LIST_ELEMENTS_RO(
-                                            grp->group_source_list, srcnode,
-                                            src)) {
-                                       char source_str[INET_ADDRSTRLEN];
-                                       char mmss[10];
-                                       char uptime[10];
-
-                                       pim_inet4_dump(
-                                               "<source?>", src->source_addr,
-                                               source_str, sizeof(source_str));
-
-                                       pim_time_timer_to_mmss(
-                                               mmss, sizeof(mmss),
-                                               src->t_source_timer);
-
-                                       pim_time_uptime(
-                                               uptime, sizeof(uptime),
+                               pim_time_timer_to_mmss(mmss, sizeof(mmss),
+                                                      src->t_source_timer);
+
+                               pim_time_uptime(uptime, sizeof(uptime),
                                                now - src->source_creation);
 
-                                       vty_out(vty,
-                                               "%-16s %-15s %-15s %-15s %5s %3s %8s\n",
-                                               ifp->name, ifaddr_str,
-                                               group_str, source_str, mmss,
-                                               IGMP_SOURCE_TEST_FORWARDING(
-                                                       src->source_flags)
+                               vty_out(vty, "%-16s %-15s %-15s %5s %3s %8s\n",
+                                       ifp->name, group_str, source_str, mmss,
+                                       IGMP_SOURCE_TEST_FORWARDING(
+                                               src->source_flags)
                                                ? "Y"
                                                : "N",
-                                               uptime);
+                                       uptime);
 
-                               } /* scan group sources */
-                       }        /* scan igmp groups */
-               }                 /* scan igmp sockets */
-       }                         /* scan interfaces */
+                       } /* scan group sources */
+               }         /* scan igmp groups */
+       }                 /* scan interfaces */
 }
 
 static void igmp_show_source_retransmission(struct pim_instance *pim,
@@ -3690,57 +3634,42 @@ static void igmp_show_source_retransmission(struct pim_instance *pim,
        struct interface *ifp;
 
        vty_out(vty,
-               "Interface        Address         Group           Source          Counter\n");
+               "Interface        Group           Source          Counter\n");
 
        /* scan interfaces */
        FOR_ALL_INTERFACES (pim->vrf, ifp) {
                struct pim_interface *pim_ifp = ifp->info;
-               struct listnode *sock_node;
-               struct igmp_sock *igmp;
+               struct listnode *grpnode;
+               struct igmp_group *grp;
 
                if (!pim_ifp)
                        continue;
 
-               /* scan igmp sockets */
-               for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node,
-                                         igmp)) {
-                       char ifaddr_str[INET_ADDRSTRLEN];
-                       struct listnode *grpnode;
-                       struct igmp_group *grp;
-
-                       pim_inet4_dump("<ifaddr?>", igmp->ifaddr, ifaddr_str,
-                                      sizeof(ifaddr_str));
+               /* scan igmp groups */
+               for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode,
+                                         grp)) {
+                       char group_str[INET_ADDRSTRLEN];
+                       struct listnode *srcnode;
+                       struct igmp_source *src;
 
-                       /* scan igmp groups */
-                       for (ALL_LIST_ELEMENTS_RO(igmp->igmp_group_list,
-                                                 grpnode, grp)) {
-                               char group_str[INET_ADDRSTRLEN];
-                               struct listnode *srcnode;
-                               struct igmp_source *src;
+                       pim_inet4_dump("<group?>", grp->group_addr, group_str,
+                                      sizeof(group_str));
 
-                               pim_inet4_dump("<group?>", grp->group_addr,
-                                              group_str, sizeof(group_str));
+                       /* scan group sources */
+                       for (ALL_LIST_ELEMENTS_RO(grp->group_source_list,
+                                                 srcnode, src)) {
+                               char source_str[INET_ADDRSTRLEN];
 
-                               /* scan group sources */
-                               for (ALL_LIST_ELEMENTS_RO(
-                                            grp->group_source_list, srcnode,
-                                            src)) {
-                                       char source_str[INET_ADDRSTRLEN];
+                               pim_inet4_dump("<source?>", src->source_addr,
+                                              source_str, sizeof(source_str));
 
-                                       pim_inet4_dump(
-                                               "<source?>", src->source_addr,
-                                               source_str, sizeof(source_str));
+                               vty_out(vty, "%-16s %-15s %-15s %7d\n",
+                                       ifp->name, group_str, source_str,
+                                       src->source_query_retransmit_count);
 
-                                       vty_out(vty,
-                                               "%-16s %-15s %-15s %-15s %7d\n",
-                                               ifp->name, ifaddr_str,
-                                               group_str, source_str,
-                                               src->source_query_retransmit_count);
-
-                               } /* scan group sources */
-                       }        /* scan igmp groups */
-               }                 /* scan igmp sockets */
-       }                         /* scan interfaces */
+                       } /* scan group sources */
+               }         /* scan igmp groups */
+       }                 /* scan interfaces */
 }
 
 static void pim_show_bsr(struct pim_instance *pim,
@@ -3913,7 +3842,7 @@ static void pim_cli_legacy_mesh_group_behavior(struct vty *vty,
                              xpath_member_value)) {
                member_dnode = yang_dnode_get(vty->candidate_config->dnode,
                                              xpath_member_value);
-               if (!yang_is_last_list_dnode(member_dnode))
+               if (!member_dnode || !yang_is_last_list_dnode(member_dnode))
                        return;
        }
 
@@ -3993,8 +3922,7 @@ static void clear_mroute(struct pim_instance *pim)
        /* scan interfaces */
        FOR_ALL_INTERFACES (pim->vrf, ifp) {
                struct pim_interface *pim_ifp = ifp->info;
-               struct listnode *sock_node;
-               struct igmp_sock *igmp;
+               struct igmp_group *grp;
                struct pim_ifchannel *ch;
 
                if (!pim_ifp)
@@ -4008,20 +3936,12 @@ static void clear_mroute(struct pim_instance *pim)
                }
 
                /* clean up all igmp groups */
-               /* scan igmp sockets */
-               for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node,
-                                         igmp)) {
 
-                       struct igmp_group *grp;
-
-                       if (igmp->igmp_group_list) {
-                               while (igmp->igmp_group_list->count) {
-                                       grp = listnode_head(
-                                               igmp->igmp_group_list);
-                                       igmp_group_delete(grp);
-                               }
+               if (pim_ifp->igmp_group_list) {
+                       while (pim_ifp->igmp_group_list->count) {
+                               grp = listnode_head(pim_ifp->igmp_group_list);
+                               igmp_group_delete(grp);
                        }
-
                }
        }
 
@@ -4220,10 +4140,9 @@ static void clear_pim_bsr_db(struct pim_instance *pim)
                        rpnode->info = NULL;
                        route_unlock_node(rpnode);
                        route_unlock_node(rpnode);
+                       XFREE(MTYPE_PIM_RP, rp_info);
                }
 
-               XFREE(MTYPE_PIM_RP, rp_info);
-
                pim_free_bsgrp_node(bsgrp->scope->bsrp_table, &bsgrp->group);
                pim_free_bsgrp_data(bsgrp);
        }
@@ -7179,7 +7098,7 @@ DEFPY (pim_register_accept_list,
 
 DEFUN (ip_pim_joinprune_time,
        ip_pim_joinprune_time_cmd,
-       "ip pim join-prune-interval (5-600)",
+       "ip pim join-prune-interval (1-65535)",
        IP_STR
        "pim multicast routing\n"
        "Join Prune Send Interval\n"
@@ -7193,27 +7112,22 @@ DEFUN (ip_pim_joinprune_time,
 
 DEFUN (no_ip_pim_joinprune_time,
        no_ip_pim_joinprune_time_cmd,
-       "no ip pim join-prune-interval (5-600)",
+       "no ip pim join-prune-interval [(1-65535)]",
        NO_STR
        IP_STR
        "pim multicast routing\n"
        "Join Prune Send Interval\n"
-       "Seconds\n")
+       IGNORED_IN_NO_STR)
 {
-       char jp_default_timer[5];
-
-       snprintf(jp_default_timer, sizeof(jp_default_timer), "%d",
-                PIM_DEFAULT_T_PERIODIC);
-
        nb_cli_enqueue_change(vty, "/frr-pim:pim/join-prune-interval",
-                             NB_OP_MODIFY, jp_default_timer);
+                             NB_OP_DESTROY, NULL);
 
        return nb_cli_apply_changes(vty, NULL);
 }
 
 DEFUN (ip_pim_register_suppress,
        ip_pim_register_suppress_cmd,
-       "ip pim register-suppress-time (5-60000)",
+       "ip pim register-suppress-time (1-65535)",
        IP_STR
        "pim multicast routing\n"
        "Register Suppress Timer\n"
@@ -7227,27 +7141,22 @@ DEFUN (ip_pim_register_suppress,
 
 DEFUN (no_ip_pim_register_suppress,
        no_ip_pim_register_suppress_cmd,
-       "no ip pim register-suppress-time (5-60000)",
+       "no ip pim register-suppress-time [(1-65535)]",
        NO_STR
        IP_STR
        "pim multicast routing\n"
        "Register Suppress Timer\n"
-       "Seconds\n")
+       IGNORED_IN_NO_STR)
 {
-       char rs_default_timer[5];
-
-       snprintf(rs_default_timer, sizeof(rs_default_timer), "%d",
-                PIM_REGISTER_SUPPRESSION_TIME_DEFAULT);
-
        nb_cli_enqueue_change(vty, "/frr-pim:pim/register-suppress-time",
-                             NB_OP_MODIFY, rs_default_timer);
+                             NB_OP_DESTROY, NULL);
 
        return nb_cli_apply_changes(vty, NULL);
 }
 
 DEFUN (ip_pim_rp_keep_alive,
        ip_pim_rp_keep_alive_cmd,
-       "ip pim rp keep-alive-timer (31-60000)",
+       "ip pim rp keep-alive-timer (1-65535)",
        IP_STR
        "pim multicast routing\n"
        "Rendevous Point\n"
@@ -7274,20 +7183,26 @@ DEFUN (ip_pim_rp_keep_alive,
 
 DEFUN (no_ip_pim_rp_keep_alive,
        no_ip_pim_rp_keep_alive_cmd,
-       "no ip pim rp keep-alive-timer (31-60000)",
+       "no ip pim rp keep-alive-timer [(1-65535)]",
        NO_STR
        IP_STR
        "pim multicast routing\n"
        "Rendevous Point\n"
        "Keep alive Timer\n"
-       "Seconds\n")
+       IGNORED_IN_NO_STR)
 {
        const char *vrfname;
-       char rp_ka_timer[5];
+       char rp_ka_timer[6];
        char rp_ka_timer_xpath[XPATH_MAXLEN];
+       uint v;
 
-       snprintf(rp_ka_timer, sizeof(rp_ka_timer), "%d",
-                               PIM_RP_KEEPALIVE_PERIOD);
+       /* RFC4601 */
+       v = yang_dnode_get_uint16(vty->candidate_config->dnode,
+                                 "/frr-pim:pim/register-suppress-time");
+       v = 3 * v + PIM_REGISTER_PROBE_TIME_DEFAULT;
+       if (v > UINT16_MAX)
+               v = UINT16_MAX;
+       snprintf(rp_ka_timer, sizeof(rp_ka_timer), "%u", v);
 
        vrfname = pim_cli_get_vrf_name(vty);
        if (vrfname == NULL)
@@ -7306,7 +7221,7 @@ DEFUN (no_ip_pim_rp_keep_alive,
 
 DEFUN (ip_pim_keep_alive,
        ip_pim_keep_alive_cmd,
-       "ip pim keep-alive-timer (31-60000)",
+       "ip pim keep-alive-timer (1-65535)",
        IP_STR
        "pim multicast routing\n"
        "Keep alive Timer\n"
@@ -7331,19 +7246,16 @@ DEFUN (ip_pim_keep_alive,
 
 DEFUN (no_ip_pim_keep_alive,
        no_ip_pim_keep_alive_cmd,
-       "no ip pim keep-alive-timer (31-60000)",
+       "no ip pim keep-alive-timer [(1-65535)]",
        NO_STR
        IP_STR
        "pim multicast routing\n"
        "Keep alive Timer\n"
-       "Seconds\n")
+       IGNORED_IN_NO_STR)
 {
        const char *vrfname;
-       char ka_timer[5];
        char ka_timer_xpath[XPATH_MAXLEN];
 
-       snprintf(ka_timer, sizeof(ka_timer), "%d", PIM_KEEPALIVE_PERIOD);
-
        vrfname = pim_cli_get_vrf_name(vty);
        if (vrfname == NULL)
                return CMD_WARNING_CONFIG_FAILED;
@@ -7352,15 +7264,14 @@ DEFUN (no_ip_pim_keep_alive,
                 "frr-pim:pimd", "pim", vrfname);
        strlcat(ka_timer_xpath, "/keep-alive-timer", sizeof(ka_timer_xpath));
 
-       nb_cli_enqueue_change(vty, ka_timer_xpath, NB_OP_MODIFY,
-                             ka_timer);
+       nb_cli_enqueue_change(vty, ka_timer_xpath, NB_OP_DESTROY, NULL);
 
        return nb_cli_apply_changes(vty, NULL);
 }
 
 DEFUN (ip_pim_packets,
        ip_pim_packets_cmd,
-       "ip pim packets (1-100)",
+       "ip pim packets (1-255)",
        IP_STR
        "pim multicast routing\n"
        "packets to process at one time per fd\n"
@@ -7374,27 +7285,21 @@ DEFUN (ip_pim_packets,
 
 DEFUN (no_ip_pim_packets,
        no_ip_pim_packets_cmd,
-       "no ip pim packets (1-100)",
+       "no ip pim packets [(1-255)]",
        NO_STR
        IP_STR
        "pim multicast routing\n"
        "packets to process at one time per fd\n"
-       "Number of packets\n")
+       IGNORED_IN_NO_STR)
 {
-       char default_packet[3];
-
-       snprintf(default_packet, sizeof(default_packet), "%d",
-                PIM_DEFAULT_PACKET_PROCESS);
-
-       nb_cli_enqueue_change(vty, "/frr-pim:pim/packets", NB_OP_MODIFY,
-                             default_packet);
+       nb_cli_enqueue_change(vty, "/frr-pim:pim/packets", NB_OP_DESTROY, NULL);
 
        return nb_cli_apply_changes(vty, NULL);
 }
 
 DEFPY (igmp_group_watermark,
        igmp_group_watermark_cmd,
-       "ip igmp watermark-warn (10-60000)$limit",
+       "ip igmp watermark-warn (1-65535)$limit",
        IP_STR
        IGMP_STR
        "Configure group limit for watermark warning\n"
@@ -7408,12 +7313,12 @@ DEFPY (igmp_group_watermark,
 
 DEFPY (no_igmp_group_watermark,
        no_igmp_group_watermark_cmd,
-       "no ip igmp watermark-warn [(10-60000)$limit]",
+       "no ip igmp watermark-warn [(1-65535)$limit]",
        NO_STR
        IP_STR
        IGMP_STR
        "Unconfigure group limit for watermark warning\n"
-       "Group count to generate watermark warning\n")
+       IGNORED_IN_NO_STR)
 {
        PIM_DECLVAR_CONTEXT(vrf, pim);
        pim->igmp_watermark_limit = 0;
@@ -8146,7 +8051,7 @@ DEFUN (interface_no_ip_igmp_join,
 
 DEFUN (interface_ip_igmp_query_interval,
        interface_ip_igmp_query_interval_cmd,
-       "ip igmp query-interval (1-1800)",
+       "ip igmp query-interval (1-65535)",
        IP_STR
        IFACE_IGMP_STR
        IFACE_IGMP_QUERY_INTERVAL_STR
@@ -8174,19 +8079,14 @@ DEFUN (interface_ip_igmp_query_interval,
 
 DEFUN (interface_no_ip_igmp_query_interval,
        interface_no_ip_igmp_query_interval_cmd,
-       "no ip igmp query-interval",
+       "no ip igmp query-interval [(1-65535)]",
        NO_STR
        IP_STR
        IFACE_IGMP_STR
-       IFACE_IGMP_QUERY_INTERVAL_STR)
+       IFACE_IGMP_QUERY_INTERVAL_STR
+       IGNORED_IN_NO_STR)
 {
-       char default_query_interval[5];
-
-       snprintf(default_query_interval, sizeof(default_query_interval), "%d",
-                IGMP_GENERAL_QUERY_INTERVAL);
-
-       nb_cli_enqueue_change(vty, "./query-interval", NB_OP_MODIFY,
-                             default_query_interval);
+       nb_cli_enqueue_change(vty, "./query-interval", NB_OP_DESTROY, NULL);
 
        return nb_cli_apply_changes(vty, "./frr-igmp:igmp");
 }
@@ -8222,7 +8122,7 @@ DEFUN (interface_no_ip_igmp_version,
 
 DEFUN (interface_ip_igmp_query_max_response_time,
        interface_ip_igmp_query_max_response_time_cmd,
-       "ip igmp query-max-response-time (10-250)",
+       "ip igmp query-max-response-time (1-65535)",
        IP_STR
        IFACE_IGMP_STR
        IFACE_IGMP_QUERY_MAX_RESPONSE_TIME_STR
@@ -8251,27 +8151,21 @@ DEFUN (interface_ip_igmp_query_max_response_time,
 
 DEFUN (interface_no_ip_igmp_query_max_response_time,
        interface_no_ip_igmp_query_max_response_time_cmd,
-       "no ip igmp query-max-response-time (10-250)",
+       "no ip igmp query-max-response-time [(1-65535)]",
        NO_STR
        IP_STR
        IFACE_IGMP_STR
        IFACE_IGMP_QUERY_MAX_RESPONSE_TIME_STR
-       "Time for response in deci-seconds\n")
+       IGNORED_IN_NO_STR)
 {
-       char default_query_max_response_time[4];
-
-       snprintf(default_query_max_response_time,
-                sizeof(default_query_max_response_time),
-                "%d", IGMP_QUERY_MAX_RESPONSE_TIME_DSEC);
-
-       nb_cli_enqueue_change(vty, "./query-max-response-time", NB_OP_MODIFY,
-                             default_query_max_response_time);
+       nb_cli_enqueue_change(vty, "./query-max-response-time", NB_OP_DESTROY,
+                             NULL);
        return nb_cli_apply_changes(vty, "./frr-igmp:igmp");
 }
 
 DEFUN_HIDDEN (interface_ip_igmp_query_max_response_time_dsec,
              interface_ip_igmp_query_max_response_time_dsec_cmd,
-             "ip igmp query-max-response-time-dsec (10-250)",
+             "ip igmp query-max-response-time-dsec (1-65535)",
              IP_STR
              IFACE_IGMP_STR
              IFACE_IGMP_QUERY_MAX_RESPONSE_TIME_DSEC_STR
@@ -8299,27 +8193,22 @@ DEFUN_HIDDEN (interface_ip_igmp_query_max_response_time_dsec,
 
 DEFUN_HIDDEN (interface_no_ip_igmp_query_max_response_time_dsec,
              interface_no_ip_igmp_query_max_response_time_dsec_cmd,
-             "no ip igmp query-max-response-time-dsec",
+             "no ip igmp query-max-response-time-dsec [(1-65535)]",
              NO_STR
              IP_STR
              IFACE_IGMP_STR
-             IFACE_IGMP_QUERY_MAX_RESPONSE_TIME_DSEC_STR)
+             IFACE_IGMP_QUERY_MAX_RESPONSE_TIME_DSEC_STR
+             IGNORED_IN_NO_STR)
 {
-       char default_query_max_response_time[4];
-
-       snprintf(default_query_max_response_time,
-                sizeof(default_query_max_response_time),
-                "%d", IGMP_QUERY_MAX_RESPONSE_TIME_DSEC);
-
-       nb_cli_enqueue_change(vty, "./query-max-response-time", NB_OP_MODIFY,
-                             default_query_max_response_time);
+       nb_cli_enqueue_change(vty, "./query-max-response-time", NB_OP_DESTROY,
+                             NULL);
 
        return nb_cli_apply_changes(vty, "./frr-igmp:igmp");
 }
 
 DEFUN (interface_ip_igmp_last_member_query_count,
        interface_ip_igmp_last_member_query_count_cmd,
-       "ip igmp last-member-query-count (1-7)",
+       "ip igmp last-member-query-count (1-255)",
        IP_STR
        IFACE_IGMP_STR
        IFACE_IGMP_LAST_MEMBER_QUERY_COUNT_STR
@@ -8347,27 +8236,22 @@ DEFUN (interface_ip_igmp_last_member_query_count,
 
 DEFUN (interface_no_ip_igmp_last_member_query_count,
        interface_no_ip_igmp_last_member_query_count_cmd,
-       "no ip igmp last-member-query-count [(1-7)]",
+       "no ip igmp last-member-query-count [(1-255)]",
        NO_STR
        IP_STR
        IFACE_IGMP_STR
        IFACE_IGMP_LAST_MEMBER_QUERY_COUNT_STR
-       "Last member query count\n")
+       IGNORED_IN_NO_STR)
 {
-       char default_robustness[2];
-
-       snprintf(default_robustness, sizeof(default_robustness), "%d",
-                IGMP_DEFAULT_ROBUSTNESS_VARIABLE);
-
-       nb_cli_enqueue_change(vty, "./robustness-variable", NB_OP_MODIFY,
-                             default_robustness);
+       nb_cli_enqueue_change(vty, "./robustness-variable", NB_OP_DESTROY,
+                             NULL);
 
        return nb_cli_apply_changes(vty, "./frr-igmp:igmp");
 }
 
 DEFUN (interface_ip_igmp_last_member_query_interval,
        interface_ip_igmp_last_member_query_interval_cmd,
-       "ip igmp last-member-query-interval (1-255)",
+       "ip igmp last-member-query-interval (1-65535)",
        IP_STR
        IFACE_IGMP_STR
        IFACE_IGMP_LAST_MEMBER_QUERY_INTERVAL_STR
@@ -8395,21 +8279,15 @@ DEFUN (interface_ip_igmp_last_member_query_interval,
 
 DEFUN (interface_no_ip_igmp_last_member_query_interval,
        interface_no_ip_igmp_last_member_query_interval_cmd,
-       "no ip igmp last-member-query-interval [(1-255)]",
+       "no ip igmp last-member-query-interval [(1-65535)]",
        NO_STR
        IP_STR
        IFACE_IGMP_STR
        IFACE_IGMP_LAST_MEMBER_QUERY_INTERVAL_STR
-       "Last member query interval in deciseconds\n")
+       IGNORED_IN_NO_STR)
 {
-       char default_last_member_query_count[4];
-
-       snprintf(default_last_member_query_count,
-                sizeof(default_last_member_query_count),
-                "%d", IGMP_SPECIFIC_QUERY_MAX_RESPONSE_TIME_DSEC);
-
-       nb_cli_enqueue_change(vty, "./last-member-query-interval", NB_OP_MODIFY,
-                             default_last_member_query_count);
+       nb_cli_enqueue_change(vty, "./last-member-query-interval",
+                             NB_OP_DESTROY, NULL);
 
        return nb_cli_apply_changes(vty, "./frr-igmp:igmp");
 }
@@ -8439,13 +8317,7 @@ DEFUN (interface_no_ip_pim_drprio,
        "Revert the Designated Router Priority to default\n"
        "Old Value of the Priority\n")
 {
-       char default_priority[10];
-
-       snprintf(default_priority, sizeof(default_priority), "%d",
-                PIM_DEFAULT_DR_PRIORITY);
-
-       nb_cli_enqueue_change(vty, "./dr-priority", NB_OP_MODIFY,
-                             default_priority);
+       nb_cli_enqueue_change(vty, "./dr-priority", NB_OP_DESTROY, NULL);
 
        return nb_cli_apply_changes(vty, "./frr-pim:pim");
 }
@@ -8780,7 +8652,7 @@ DEFUN (interface_no_ip_mroute,
 
 DEFUN (interface_ip_pim_hello,
        interface_ip_pim_hello_cmd,
-       "ip pim hello (1-180) [(1-630)]",
+       "ip pim hello (1-65535) [(1-65535)]",
        IP_STR
        PIM_STR
        IFACE_PIM_HELLO_STR
@@ -8815,21 +8687,15 @@ DEFUN (interface_ip_pim_hello,
 
 DEFUN (interface_no_ip_pim_hello,
        interface_no_ip_pim_hello_cmd,
-       "no ip pim hello [(1-180) [(1-630)]]",
+       "no ip pim hello [(1-65535) [(1-65535)]]",
        NO_STR
        IP_STR
        PIM_STR
        IFACE_PIM_HELLO_STR
-       IFACE_PIM_HELLO_TIME_STR
-       IFACE_PIM_HELLO_HOLD_STR)
+       IGNORED_IN_NO_STR
+       IGNORED_IN_NO_STR)
 {
-       char hello_default_timer[3];
-
-       snprintf(hello_default_timer, sizeof(hello_default_timer), "%d",
-                PIM_DEFAULT_HELLO_PERIOD);
-
-       nb_cli_enqueue_change(vty, "./hello-interval", NB_OP_MODIFY,
-                             hello_default_timer);
+       nb_cli_enqueue_change(vty, "./hello-interval", NB_OP_DESTROY, NULL);
        nb_cli_enqueue_change(vty, "./hello-holdtime", NB_OP_DESTROY, NULL);
 
        return nb_cli_apply_changes(vty, "./frr-pim:pim");
@@ -9636,10 +9502,10 @@ DEFUN (no_ip_pim_ucast_bsm,
 }
 
 #if HAVE_BFDD > 0
-DEFUN_HIDDEN(
+DEFUN_HIDDEN (
        ip_pim_bfd_param,
        ip_pim_bfd_param_cmd,
-       "ip pim bfd (2-255) (50-60000) (50-60000)",
+       "ip pim bfd (2-255) (1-65535) (1-65535)",
        IP_STR
        PIM_STR
        "Enables BFD support\n"
@@ -9650,7 +9516,7 @@ DEFUN_HIDDEN(
        DEFUN(
                ip_pim_bfd_param,
                ip_pim_bfd_param_cmd,
-               "ip pim bfd (2-255) (50-60000) (50-60000)",
+               "ip pim bfd (2-255) (1-65535) (1-65535)",
                IP_STR
                PIM_STR
                "Enables BFD support\n"
@@ -9689,7 +9555,10 @@ DEFUN_HIDDEN(
 
 #if HAVE_BFDD == 0
 ALIAS(no_ip_pim_bfd, no_ip_pim_bfd_param_cmd,
-      "no ip pim bfd (2-255) (50-60000) (50-60000)", NO_STR IP_STR PIM_STR
+      "no ip pim bfd (2-255) (1-65535) (1-65535)",
+      NO_STR
+      IP_STR
+      PIM_STR
       "Enables BFD support\n"
       "Detect Multiplier\n"
       "Required min receive interval\n"
@@ -9728,7 +9597,7 @@ DEFPY(ip_msdp_peer, ip_msdp_peer_cmd,
 }
 
 DEFPY(ip_msdp_timers, ip_msdp_timers_cmd,
-      "ip msdp timers (2-600)$keepalive (3-600)$holdtime [(1-600)$connretry]",
+      "ip msdp timers (1-65535)$keepalive (1-65535)$holdtime [(1-65535)$connretry]",
       IP_STR
       CFG_MSDP_STR
       "MSDP timers configuration\n"
@@ -9759,6 +9628,35 @@ DEFPY(ip_msdp_timers, ip_msdp_timers_cmd,
        return CMD_SUCCESS;
 }
 
+DEFPY(no_ip_msdp_timers, no_ip_msdp_timers_cmd,
+      "no ip msdp timers [(1-65535) (1-65535) [(1-65535)]]",
+      NO_STR
+      IP_STR
+      CFG_MSDP_STR
+      "MSDP timers configuration\n"
+      IGNORED_IN_NO_STR
+      IGNORED_IN_NO_STR
+      IGNORED_IN_NO_STR)
+{
+       const char *vrfname;
+       char xpath[XPATH_MAXLEN];
+
+       vrfname = pim_cli_get_vrf_name(vty);
+       if (vrfname == NULL)
+               return CMD_WARNING_CONFIG_FAILED;
+
+       snprintf(xpath, sizeof(xpath), FRR_PIM_MSDP_XPATH, "frr-pim:pimd",
+                "pim", vrfname, "frr-routing:ipv4");
+
+       nb_cli_enqueue_change(vty, "./hold-time", NB_OP_DESTROY, NULL);
+       nb_cli_enqueue_change(vty, "./keep-alive", NB_OP_DESTROY, NULL);
+       nb_cli_enqueue_change(vty, "./connection-retry", NB_OP_DESTROY, NULL);
+
+       nb_cli_apply_changes(vty, xpath);
+
+       return CMD_SUCCESS;
+}
+
 DEFUN (no_ip_msdp_peer,
        no_ip_msdp_peer_cmd,
        "no ip msdp peer A.B.C.D",
@@ -9863,7 +9761,7 @@ DEFPY(no_ip_msdp_mesh_group_member,
                return CMD_WARNING_CONFIG_FAILED;
        }
 
-       nb_cli_enqueue_change(vty, xpath_value, NB_OP_DESTROY, NULL);
+       nb_cli_enqueue_change(vty, xpath_member_value, NB_OP_DESTROY, NULL);
 
        /*
         * If this is the last member, then we must remove the group altogether
@@ -9897,7 +9795,7 @@ DEFPY(ip_msdp_mesh_group_source,
                 "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", gname);
        nb_cli_enqueue_change(vty, xpath_value, NB_OP_CREATE, NULL);
 
-       /* Create mesh group member. */
+       /* Create mesh group source. */
        strlcat(xpath_value, "/source", sizeof(xpath_value));
        nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, saddr_str);
 
@@ -9928,7 +9826,7 @@ DEFPY(no_ip_msdp_mesh_group_source,
                 "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", gname);
        nb_cli_enqueue_change(vty, xpath_value, NB_OP_CREATE, NULL);
 
-       /* Create mesh group member. */
+       /* Create mesh group source. */
        strlcat(xpath_value, "/source", sizeof(xpath_value));
        nb_cli_enqueue_change(vty, xpath_value, NB_OP_DESTROY, NULL);
 
@@ -11383,6 +11281,8 @@ void pim_cmd_init(void)
 
        install_element(CONFIG_NODE, &ip_msdp_timers_cmd);
        install_element(VRF_NODE, &ip_msdp_timers_cmd);
+       install_element(CONFIG_NODE, &no_ip_msdp_timers_cmd);
+       install_element(VRF_NODE, &no_ip_msdp_timers_cmd);
        install_element(CONFIG_NODE, &ip_msdp_mesh_group_member_cmd);
        install_element(VRF_NODE, &ip_msdp_mesh_group_member_cmd);
        install_element(CONFIG_NODE, &no_ip_msdp_mesh_group_member_cmd);