]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_ssm.c
lib: enforce vrf_name_to_id by returning default_vrf when name is null
[mirror_frr.git] / pimd / pim_ssm.c
index e02bdfa215c80f5104c69dae30ea9fd05b2c4e1c..dfc7063fd0f6ad9f0121cccc3e6bae4fc55da869 100644 (file)
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- * MA 02110-1301 USA
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <zebra.h>
 #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
@@ -48,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))) {
@@ -62,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)
@@ -71,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;
@@ -89,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);
        }
@@ -101,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 != VRF_DEFAULT)
+       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))
@@ -126,23 +132,27 @@ 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;
 }
 
-void *pim_ssm_init(vrf_id_t vrf_id)
+void *pim_ssm_init(void)
 {
        struct pim_ssm *ssm;
 
        ssm = XCALLOC(MTYPE_PIM_SSM_INFO, sizeof(*ssm));
-       ssm->vrf_id = vrf_id;
 
        return ssm;
 }
 
 void pim_ssm_terminate(struct pim_ssm *ssm)
 {
-       if (ssm && ssm->plist_name)
+       if (!ssm)
+               return;
+
+       if (ssm->plist_name)
                XFREE(MTYPE_PIM_FILTER_NAME, ssm->plist_name);
+
+       XFREE(MTYPE_PIM_SSM_INFO, ssm);
 }