]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_rp.c
lib: enforce vrf_name_to_id by returning default_vrf when name is null
[mirror_frr.git] / pimd / pim_rp.c
index c1623ec15e7ebd6779e3d409786418e07dff96cd..6b76794b75eecdfd6499975c409505fa0a50a9e4 100644 (file)
@@ -31,6 +31,7 @@
 #include "plist.h"
 #include "nexthop.h"
 #include "table.h"
+#include "lib_errors.h"
 
 #include "pimd.h"
 #include "pim_vty.h"
@@ -51,17 +52,22 @@ void pim_rp_list_hash_clean(void *data)
 {
        struct pim_nexthop_cache *pnc = (struct pim_nexthop_cache *)data;
 
-       list_delete_and_null(&pnc->rp_list);
+       list_delete(&pnc->rp_list);
 
        hash_clean(pnc->upstream_hash, NULL);
        hash_free(pnc->upstream_hash);
        pnc->upstream_hash = NULL;
+       if (pnc->nexthop)
+               nexthops_free(pnc->nexthop);
 
        XFREE(MTYPE_PIM_NEXTHOP_CACHE, pnc);
 }
 
 static void pim_rp_info_free(struct rp_info *rp_info)
 {
+       if (rp_info->plist)
+               XFREE(MTYPE_PIM_FILTER_NAME, rp_info->plist);
+
        XFREE(MTYPE_PIM_RP, rp_info);
 }
 
@@ -99,25 +105,17 @@ void pim_rp_init(struct pim_instance *pim)
        struct route_node *rn;
 
        pim->rp_list = list_new();
-       if (!pim->rp_list) {
-               zlog_err("Unable to alloc rp_list");
-               return;
-       }
        pim->rp_list->del = (void (*)(void *))pim_rp_info_free;
        pim->rp_list->cmp = pim_rp_list_cmp;
 
        pim->rp_table = route_table_init();
-       if (!pim->rp_table) {
-               zlog_err("Unable to alloc rp_table");
-               list_delete_and_null(&pim->rp_list);
-               return;
-       }
 
        rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info));
 
        if (!str2prefix("224.0.0.0/4", &rp_info->group)) {
-               zlog_err("Unable to convert 224.0.0.0/4 to prefix");
-               list_delete_and_null(&pim->rp_list);
+               flog_err(EC_LIB_DEVELOPMENT,
+                        "Unable to convert 224.0.0.0/4 to prefix");
+               list_delete(&pim->rp_list);
                route_table_finish(pim->rp_table);
                XFREE(MTYPE_PIM_RP, rp_info);
                return;
@@ -130,14 +128,6 @@ void pim_rp_init(struct pim_instance *pim)
        listnode_add(pim->rp_list, rp_info);
 
        rn = route_node_get(pim->rp_table, &rp_info->group);
-       if (!rn) {
-               zlog_err("Failure to get route node for pim->rp_table");
-               list_delete_and_null(&pim->rp_list);
-               route_table_finish(pim->rp_table);
-               XFREE(MTYPE_PIM_RP, rp_info);
-               return;
-       }
-
        rn->info = rp_info;
        if (PIM_DEBUG_TRACE)
                zlog_debug(
@@ -148,7 +138,7 @@ void pim_rp_init(struct pim_instance *pim)
 void pim_rp_free(struct pim_instance *pim)
 {
        if (pim->rp_list)
-               list_delete_and_null(&pim->rp_list);
+               list_delete(&pim->rp_list);
 }
 
 /*
@@ -245,7 +235,8 @@ static struct rp_info *pim_rp_find_match_group(struct pim_instance *pim,
 
        rn = route_node_match(pim->rp_table, group);
        if (!rn) {
-               zlog_err(
+               flog_err(
+                       EC_LIB_DEVELOPMENT,
                        "%s: BUG We should have found default group information\n",
                        __PRETTY_FUNCTION__);
                return best;
@@ -600,7 +591,6 @@ int pim_rp_del(struct pim_instance *pim, const char *rp,
 
        if (rp_info->plist) {
                XFREE(MTYPE_PIM_FILTER_NAME, rp_info->plist);
-               rp_info->plist = NULL;
                was_plist = true;
        }
 
@@ -634,7 +624,9 @@ int pim_rp_del(struct pim_instance *pim, const char *rp,
                rn = route_node_get(pim->rp_table, &rp_info->group);
                if (rn) {
                        if (rn->info != rp_info)
-                               zlog_err("WTF matey");
+                               flog_err(
+                                       EC_LIB_DEVELOPMENT,
+                                       "Expected rn->info to be equal to rp_info");
 
                        if (PIM_DEBUG_TRACE) {
                                char buf[PREFIX_STRLEN];
@@ -852,9 +844,9 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, struct in_addr group)
                                        __PRETTY_FUNCTION__, buf, buf1);
                        }
                        pim_rpf_set_refresh_time(pim);
-                       pim_ecmp_nexthop_lookup(pim,
-                                               &rp_info->rp.source_nexthop,
-                                               &nht_p, &rp_info->group, 1);
+                       (void)pim_ecmp_nexthop_lookup(
+                               pim, &rp_info->rp.source_nexthop, &nht_p,
+                               &rp_info->group, 1);
                }
                return (&rp_info->rp);
        }
@@ -959,8 +951,7 @@ int pim_rp_check_is_my_ip_address(struct pim_instance *pim,
        return 0;
 }
 
-void pim_rp_show_information(struct pim_instance *pim, struct vty *vty,
-                            uint8_t uj)
+void pim_rp_show_information(struct pim_instance *pim, struct vty *vty, bool uj)
 {
        struct rp_info *rp_info;
        struct rp_info *prev_rp_info = NULL;