#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
* will
* disappear in time for SSM groups.
*/
- pim_upstream_register_reevaluate(pimg);
- 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))) {
return;
}
- pim_ssm_range_reevaluate();
+ pim_ssm_range_reevaluate(pim);
}
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;
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);
}
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))
}
if (change)
- pim_ssm_range_reevaluate();
+ pim_ssm_range_reevaluate(pim);
return PIM_SSM_ERR_NONE;
}
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);
}