]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_ssm.c
Merge pull request #5430 from taruta811/build-docker-centos
[mirror_frr.git] / pimd / pim_ssm.c
index b11b498aa6e428291fab3cfe5ec500ba93942504..6a70a73b4589caa253e1e6f7b0b636939f9d6870 100644 (file)
 #include <lib/vty.h>
 #include <lib/vrf.h>
 #include <lib/plist.h>
+#include <lib/lib_errors.h>
 
 #include "pimd.h"
 #include "pim_ssm.h"
 #include "pim_zebra.h"
 
-static void pim_ssm_range_reevaluate(void)
+static void pim_ssm_range_reevaluate(struct pim_instance *pim)
 {
        /* 1. Setup register state for (S,G) entries if G has changed from SSM
         * to
@@ -47,13 +48,14 @@ static void pim_ssm_range_reevaluate(void)
         * will
         * disappear in time for SSM groups.
         */
-       pim_upstream_register_reevaluate();
-       igmp_source_forward_reevaluate_all();
+       pim_upstream_register_reevaluate(pim);
+       igmp_source_forward_reevaluate_all(pim);
 }
 
-void pim_ssm_prefix_list_update(struct prefix_list *plist)
+void pim_ssm_prefix_list_update(struct pim_instance *pim,
+                               struct prefix_list *plist)
 {
-       struct pim_ssm *ssm = pimg->ssm_info;
+       struct pim_ssm *ssm = pim->ssm_info;
 
        if (!ssm->plist_name
            || strcmp(ssm->plist_name, prefix_list_name(plist))) {
@@ -61,7 +63,7 @@ void pim_ssm_prefix_list_update(struct prefix_list *plist)
                return;
        }
 
-       pim_ssm_range_reevaluate();
+       pim_ssm_range_reevaluate(pim);
 }
 
 static int pim_is_grp_standard_ssm(struct prefix *group)
@@ -70,14 +72,18 @@ static int pim_is_grp_standard_ssm(struct prefix *group)
        static struct prefix group_ssm;
 
        if (first) {
-               str2prefix(PIM_SSM_STANDARD_RANGE, &group_ssm);
+               if (!str2prefix(PIM_SSM_STANDARD_RANGE, &group_ssm))
+                       flog_err(EC_LIB_DEVELOPMENT,
+                                "%s: Failure to Read Group Address: %s",
+                                __PRETTY_FUNCTION__, PIM_SSM_STANDARD_RANGE);
+
                first = 0;
        }
 
        return prefix_match(&group_ssm, group);
 }
 
-int pim_is_grp_ssm(struct in_addr group_addr)
+int pim_is_grp_ssm(struct pim_instance *pim, struct in_addr group_addr)
 {
        struct pim_ssm *ssm;
        struct prefix group;
@@ -88,7 +94,7 @@ int pim_is_grp_ssm(struct in_addr group_addr)
        group.u.prefix4 = group_addr;
        group.prefixlen = 32;
 
-       ssm = pimg->ssm_info;
+       ssm = pim->ssm_info;
        if (!ssm->plist_name) {
                return pim_is_grp_standard_ssm(&group);
        }
@@ -100,15 +106,16 @@ int pim_is_grp_ssm(struct in_addr group_addr)
        return (prefix_list_apply(plist, &group) == PREFIX_PERMIT);
 }
 
-int pim_ssm_range_set(vrf_id_t vrf_id, const char *plist_name)
+int pim_ssm_range_set(struct pim_instance *pim, vrf_id_t vrf_id,
+                     const char *plist_name)
 {
        struct pim_ssm *ssm;
        int change = 0;
 
-       if (vrf_id != pimg->vrf_id)
+       if (vrf_id != pim->vrf_id)
                return PIM_SSM_ERR_NO_VRF;
 
-       ssm = pimg->ssm_info;
+       ssm = pim->ssm_info;
        if (plist_name) {
                if (ssm->plist_name) {
                        if (!strcmp(ssm->plist_name, plist_name))
@@ -125,7 +132,7 @@ int pim_ssm_range_set(vrf_id_t vrf_id, const char *plist_name)
        }
 
        if (change)
-               pim_ssm_range_reevaluate();
+               pim_ssm_range_reevaluate(pim);
 
        return PIM_SSM_ERR_NONE;
 }
@@ -141,6 +148,10 @@ void *pim_ssm_init(void)
 
 void pim_ssm_terminate(struct pim_ssm *ssm)
 {
-       if (ssm && ssm->plist_name)
-               XFREE(MTYPE_PIM_FILTER_NAME, ssm->plist_name);
+       if (!ssm)
+               return;
+
+       XFREE(MTYPE_PIM_FILTER_NAME, ssm->plist_name);
+
+       XFREE(MTYPE_PIM_SSM_INFO, ssm);
 }