]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_rp.c
zebra: Allow ns delete to happen after under/over flow checks
[mirror_frr.git] / pimd / pim_rp.c
index 783f9317522acc30dc14f1b739f444f4cb3ac186..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,11 +52,13 @@ 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);
 }
@@ -102,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;
@@ -133,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(
@@ -151,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);
 }
 
 /*
@@ -248,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;
@@ -636,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];
@@ -961,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;