]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_msdp.c
Merge pull request #3108 from dmbaturin/master
[mirror_frr.git] / pimd / pim_msdp.c
index e798d70a51122c9fb5f954349fe6359302c4461f..9ef343a0c5d77cce189b725957bee29bace47d49 100644 (file)
@@ -28,6 +28,7 @@
 #include <lib/thread.h>
 #include <lib/vty.h>
 #include <lib/plist.h>
+#include <lib/lib_errors.h>
 
 #include "pimd.h"
 #include "pim_cmd.h"
@@ -240,11 +241,6 @@ static struct pim_msdp_sa *pim_msdp_sa_new(struct pim_instance *pim,
        struct pim_msdp_sa *sa;
 
        sa = XCALLOC(MTYPE_PIM_MSDP_SA, sizeof(*sa));
-       if (!sa) {
-               zlog_err("%s: PIM XCALLOC(%zu) failure", __PRETTY_FUNCTION__,
-                        sizeof(*sa));
-               return NULL;
-       }
 
        sa->pim = pim;
        sa->sg = *sg;
@@ -522,7 +518,8 @@ static void pim_msdp_sa_local_del_on_up_del(struct pim_instance *pim,
                         * the flow. Accounting for such cases requires lot of
                         * changes; perhaps
                         * address this in the next release? - XXX  */
-                       zlog_err(
+                       flog_err(
+                               EC_LIB_DEVELOPMENT,
                                "MSDP sa %s SPT teardown is causing the local entry to be removed",
                                sa->sg_str);
                        return;
@@ -1069,11 +1066,6 @@ static enum pim_msdp_err pim_msdp_peer_new(struct pim_instance *pim,
        pim_msdp_enable(pim);
 
        mp = XCALLOC(MTYPE_PIM_MSDP_PEER, sizeof(*mp));
-       if (!mp) {
-               zlog_err("%s: PIM XCALLOC(%zu) failure", __PRETTY_FUNCTION__,
-                        sizeof(*mp));
-               return PIM_MSDP_ERR_OOM;
-       }
 
        mp->pim = pim;
        mp->peer = peer_addr;
@@ -1252,8 +1244,10 @@ static int pim_msdp_peer_comp(const void *p1, const void *p2)
 }
 
 /************************** Mesh group management **************************/
-static void pim_msdp_mg_free(struct pim_instance *pim, struct pim_msdp_mg *mg)
+static void pim_msdp_mg_free(struct pim_instance *pim)
 {
+       struct pim_msdp_mg *mg = pim->msdp.mg;
+
        /* If the mesh-group has valid member or src_ip don't delete it */
        if (!mg || mg->mbr_cnt || (mg->src_ip.s_addr != INADDR_ANY)) {
                return;
@@ -1266,10 +1260,9 @@ static void pim_msdp_mg_free(struct pim_instance *pim, struct pim_msdp_mg *mg)
                XFREE(MTYPE_PIM_MSDP_MG_NAME, mg->mesh_group_name);
 
        if (mg->mbr_list)
-               list_delete_and_null(&mg->mbr_list);
+               list_delete(&mg->mbr_list);
 
-       XFREE(MTYPE_PIM_MSDP_MG, mg);
-       pim->msdp.mg = NULL;
+       XFREE(MTYPE_PIM_MSDP_MG, pim->msdp.mg);
 }
 
 static struct pim_msdp_mg *pim_msdp_mg_new(const char *mesh_group_name)
@@ -1277,11 +1270,6 @@ static struct pim_msdp_mg *pim_msdp_mg_new(const char *mesh_group_name)
        struct pim_msdp_mg *mg;
 
        mg = XCALLOC(MTYPE_PIM_MSDP_MG, sizeof(*mg));
-       if (!mg) {
-               zlog_err("%s: PIM XCALLOC(%zu) failure", __PRETTY_FUNCTION__,
-                        sizeof(*mg));
-               return NULL;
-       }
 
        mg->mesh_group_name = XSTRDUP(MTYPE_PIM_MSDP_MG_NAME, mesh_group_name);
        mg->mbr_list = list_new();
@@ -1314,7 +1302,7 @@ enum pim_msdp_err pim_msdp_mg_del(struct pim_instance *pim,
        mg->src_ip.s_addr = INADDR_ANY;
 
        /* free up the mesh-group */
-       pim_msdp_mg_free(pim, mg);
+       pim_msdp_mg_free(pim);
        return PIM_MSDP_ERR_NONE;
 }
 
@@ -1395,13 +1383,6 @@ enum pim_msdp_err pim_msdp_mg_mbr_add(struct pim_instance *pim,
        }
 
        mbr = XCALLOC(MTYPE_PIM_MSDP_MG_MBR, sizeof(*mbr));
-       if (!mbr) {
-               zlog_err("%s: PIM XCALLOC(%zu) failure", __PRETTY_FUNCTION__,
-                        sizeof(*mbr));
-               /* if there are no references to the mg free it */
-               pim_msdp_mg_free(pim, mg);
-               return PIM_MSDP_ERR_OOM;
-       }
        mbr->mbr_ip = mbr_ip;
        listnode_add_sort(mg->mbr_list, mbr);
 
@@ -1460,7 +1441,7 @@ enum pim_msdp_err pim_msdp_mg_mbr_del(struct pim_instance *pim,
 
        pim_msdp_mg_mbr_do_del(mg, mbr);
        /* if there are no references to the mg free it */
-       pim_msdp_mg_free(pim, mg);
+       pim_msdp_mg_free(pim);
 
        return PIM_MSDP_ERR_NONE;
 }
@@ -1497,7 +1478,7 @@ enum pim_msdp_err pim_msdp_mg_src_del(struct pim_instance *pim,
                mg->src_ip.s_addr = INADDR_ANY;
                pim_msdp_mg_src_do_del(pim);
                /* if there are no references to the mg free it */
-               pim_msdp_mg_free(pim, mg);
+               pim_msdp_mg_free(pim);
        }
        return PIM_MSDP_ERR_NONE;
 }
@@ -1620,21 +1601,29 @@ void pim_msdp_exit(struct pim_instance *pim)
 
        /* XXX: stop listener and delete all peer sessions */
 
+       pim_msdp_mg_free(pim);
+
        if (pim->msdp.peer_hash) {
+               hash_clean(pim->msdp.peer_hash, NULL);
                hash_free(pim->msdp.peer_hash);
                pim->msdp.peer_hash = NULL;
        }
 
        if (pim->msdp.peer_list) {
-               list_delete_and_null(&pim->msdp.peer_list);
+               list_delete(&pim->msdp.peer_list);
        }
 
        if (pim->msdp.sa_hash) {
+               hash_clean(pim->msdp.sa_hash, NULL);
                hash_free(pim->msdp.sa_hash);
                pim->msdp.sa_hash = NULL;
        }
 
        if (pim->msdp.sa_list) {
-               list_delete_and_null(&pim->msdp.sa_list);
+               list_delete(&pim->msdp.sa_list);
        }
+
+       if (pim->msdp.work_obuf)
+               stream_free(pim->msdp.work_obuf);
+       pim->msdp.work_obuf = NULL;
 }