]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_rp.c
Merge pull request #10409 from idryzhov/zebra-mq-clean-crash
[mirror_frr.git] / pimd / pim_rp.c
index 7ad95d9f6a9c51e762b87c2106ce5ac210a06d44..d356aff9f1a44ea66b75a08e390b8f865921a241 100644 (file)
@@ -38,7 +38,6 @@
 #include "pim_str.h"
 #include "pim_iface.h"
 #include "pim_rp.h"
-#include "pim_str.h"
 #include "pim_rpf.h"
 #include "pim_sock.h"
 #include "pim_memory.h"
@@ -413,7 +412,6 @@ void pim_upstream_update(struct pim_instance *pim, struct pim_upstream *up)
                         old_rpf.source_nexthop.interface))
                pim_zebra_upstream_rpf_changed(pim, up, &old_rpf);
 
-       pim_zebra_update_all_interfaces(pim);
 }
 
 int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
@@ -431,6 +429,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
        struct prefix nht_p;
        struct route_node *rn;
        struct pim_upstream *up;
+       bool upstream_updated = false;
 
        if (rp_addr.s_addr == INADDR_ANY ||
            rp_addr.s_addr == INADDR_NONE)
@@ -547,10 +546,14 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
                                        grp.u.prefix4 = up->sg.grp;
                                        trp_info = pim_rp_find_match_group(
                                                pim, &grp);
-                                       if (trp_info == rp_all)
+                                       if (trp_info == rp_all) {
                                                pim_upstream_update(pim, up);
+                                               upstream_updated = true;
+                                       }
                                }
                        }
+                       if (upstream_updated)
+                               pim_zebra_update_all_interfaces(pim);
 
                        pim_rp_check_interfaces(pim, rp_all);
                        pim_rp_refresh_group_to_rp_mapping(pim);
@@ -634,11 +637,16 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
                        grp.u.prefix4 = up->sg.grp;
                        trp_info = pim_rp_find_match_group(pim, &grp);
 
-                       if (trp_info == rp_info)
+                       if (trp_info == rp_info) {
                                pim_upstream_update(pim, up);
+                               upstream_updated = true;
+                       }
                }
        }
 
+       if (upstream_updated)
+               pim_zebra_update_all_interfaces(pim);
+
        pim_rp_check_interfaces(pim, rp_info);
        pim_rp_refresh_group_to_rp_mapping(pim);
 
@@ -695,6 +703,7 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr,
        struct bsgrp_node *bsgrp = NULL;
        struct bsm_rpinfo *bsrp = NULL;
        char rp_str[INET_ADDRSTRLEN];
+       bool upstream_updated = false;
 
        if (!inet_ntop(AF_INET, &rp_addr, rp_str, sizeof(rp_str)))
                snprintf(rp_str, sizeof(rp_str), "<rp?>");
@@ -837,11 +846,16 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr,
                        }
 
                        /* RP found for the group grp */
-                       else
+                       else {
                                pim_upstream_update(pim, up);
+                               upstream_updated = true;
+                       }
                }
        }
 
+       if (upstream_updated)
+               pim_zebra_update_all_interfaces(pim);
+
        XFREE(MTYPE_PIM_RP, rp_info);
        return PIM_SUCCESS;
 }
@@ -854,6 +868,7 @@ int pim_rp_change(struct pim_instance *pim, struct in_addr new_rp_addr,
        int result = 0;
        struct rp_info *rp_info = NULL;
        struct pim_upstream *up;
+       bool upstream_updated = false;
 
        rn = route_node_lookup(pim->rp_table, &group);
        if (!rn) {
@@ -908,11 +923,16 @@ int pim_rp_change(struct pim_instance *pim, struct in_addr new_rp_addr,
                        grp.u.prefix4 = up->sg.grp;
                        trp_info = pim_rp_find_match_group(pim, &grp);
 
-                       if (trp_info == rp_info)
+                       if (trp_info == rp_info) {
                                pim_upstream_update(pim, up);
+                               upstream_updated = true;
+                       }
                }
        }
 
+       if (upstream_updated)
+               pim_zebra_update_all_interfaces(pim);
+
        /* Register new RP addr with Zebra NHT */
        nht_p.u.prefix4 = rp_info->rp.rpf_addr.u.prefix4;
        if (PIM_DEBUG_PIM_NHT_RP)
@@ -1228,12 +1248,9 @@ void pim_rp_show_information(struct pim_instance *pim, struct vty *vty, bool uj)
                                        json_rp_rows = json_object_new_array();
 
                                json_row = json_object_new_object();
-                               json_object_string_add(
-                                       json_row, "rpAddress",
-                                       inet_ntop(AF_INET,
-                                                 &rp_info->rp.rpf_addr.u
-                                                     .prefix4,
-                                                 buf, sizeof(buf)));
+                               json_object_string_addf(
+                                       json_row, "rpAddress", "%pI4",
+                                       &rp_info->rp.rpf_addr.u.prefix4);
                                if (rp_info->rp.source_nexthop.interface)
                                        json_object_string_add(
                                                json_row, "outboundInterface",
@@ -1255,10 +1272,9 @@ void pim_rp_show_information(struct pim_instance *pim, struct vty *vty, bool uj)
                                                               "prefixList",
                                                               rp_info->plist);
                                else
-                                       json_object_string_add(
-                                               json_row, "group",
-                                               prefix2str(&rp_info->group, buf,
-                                                          48));
+                                       json_object_string_addf(
+                                               json_row, "group", "%pFX",
+                                               &rp_info->group);
                                json_object_string_add(json_row, "source",
                                                       source);
 
@@ -1303,9 +1319,7 @@ void pim_rp_show_information(struct pim_instance *pim, struct vty *vty, bool uj)
                                          buf, sizeof(buf)),
                                json_rp_rows);
 
-               vty_out(vty, "%s\n", json_object_to_json_string_ext(
-                                            json, JSON_C_TO_STRING_PRETTY));
-               json_object_free(json);
+               vty_json(vty, json);
        }
 }