return pim_no_rp_cmd_worker(vty, argv[4]->arg, NULL, argv[6]->arg);
}
-static int pim_ssm_cmd_worker(struct vty *vty, const char *plist)
+static int pim_ssm_cmd_worker(struct pim_instance *pim, struct vty *vty,
+ const char *plist)
{
- int result = pim_ssm_range_set(pimg->vrf_id, plist);
+ int result = pim_ssm_range_set(pim, pim->vrf_id, plist);
if (result == PIM_SSM_ERR_NONE)
return CMD_SUCCESS;
"group range prefix-list filter\n"
"Name of a prefix-list\n")
{
- return pim_ssm_cmd_worker(vty, argv[0]->arg);
+ return pim_ssm_cmd_worker(pimg, vty, argv[0]->arg);
}
DEFUN (no_ip_pim_ssm_prefix_list,
"Source Specific Multicast\n"
"group range prefix-list filter\n")
{
- return pim_ssm_cmd_worker(vty, NULL);
+ return pim_ssm_cmd_worker(pimg, vty, NULL);
}
DEFUN (no_ip_pim_ssm_prefix_list_name,
struct pim_ssm *ssm = pimg->ssm_info;
if (ssm->plist_name && !strcmp(ssm->plist_name, argv[0]->arg))
- return pim_ssm_cmd_worker(vty, NULL);
+ return pim_ssm_cmd_worker(pimg, vty, NULL);
vty_out(vty, "%% pim ssm prefix-list %s doesn't exist\n", argv[0]->arg);
type_str = "invalid";
else {
if (pim_is_group_224_4(group_addr))
- type_str = pim_is_grp_ssm(group_addr) ? "SSM" : "ASM";
+ type_str = pim_is_grp_ssm(pimg, group_addr) ? "SSM"
+ : "ASM";
else
type_str = "not-multicast";
}
/* skip (*,G) ch creation if G is of type SSM */
if (sg->src.s_addr == INADDR_ANY) {
- if (pim_is_grp_ssm(sg->grp)) {
+ if (pim_is_grp_ssm(pim, sg->grp)) {
if (PIM_DEBUG_PIM_EVENTS)
zlog_debug(
"%s: local membership (S,G)=%s ignored as group is SSM",
* If we've received a register suppress
*/
if (!up->t_rs_timer) {
- if (pim_is_grp_ssm(sg.grp)) {
+ if (pim_is_grp_ssm(pim_ifp->pim, sg.grp)) {
if (PIM_DEBUG_PIM_REG)
zlog_debug(
"%s register forward skipped as group is SSM",
{
struct pim_instance *pim = up->channel_oil->pim;
- if (pim_is_grp_ssm(up->sg.grp)) {
+ if (pim_is_grp_ssm(pim, up->sg.grp)) {
if (PIM_DEBUG_PIM_EVENTS)
zlog_debug("%s register setup skipped as group is SSM",
up->sg_str);
#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);
+ pim_upstream_register_reevaluate(pim);
igmp_source_forward_reevaluate_all();
}
-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)
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;
}
char *plist_name; /* prefix list of group ranges */
};
-void pim_ssm_prefix_list_update(struct prefix_list *plist);
-int pim_is_grp_ssm(struct in_addr group_addr);
-int pim_ssm_range_set(vrf_id_t vrf_id, const char *plist_name);
+void pim_ssm_prefix_list_update(struct pim_instance *pim,
+ struct prefix_list *plist);
+int pim_is_grp_ssm(struct pim_instance *pim, struct in_addr group_addr);
+int pim_ssm_range_set(struct pim_instance *pim, vrf_id_t vrf_id,
+ const char *plist_name);
void *pim_ssm_init(void);
void pim_ssm_terminate(struct pim_ssm *ssm);
#endif
if (!PIM_UPSTREAM_FLAG_TEST_FHR(up->flags) || !up->t_ka_timer)
continue;
- if (pim_is_grp_ssm(up->sg.grp)) {
+ if (pim_is_grp_ssm(pim, up->sg.grp)) {
/* clear the register state for SSM groups */
if (up->reg_state != PIM_REG_NOINFO) {
if (PIM_DEBUG_PIM_EVENTS)
igmp_source_forward_stop(source);
}
-static void igmp_source_forward_reevaluate_one(struct igmp_source *source)
+static void igmp_source_forward_reevaluate_one(struct pim_instance *pim,
+ struct igmp_source *source)
{
struct prefix_sg sg;
struct igmp_group *group = source->source_group;
sg.grp = group->group_addr;
ch = pim_ifchannel_find(group->group_igmp_sock->interface, &sg);
- if (pim_is_grp_ssm(group->group_addr)) {
+ if (pim_is_grp_ssm(pim, group->group_addr)) {
/* If SSM group withdraw local membership */
if (ch
&& (ch->local_ifmembership == PIM_IFMEMBERSHIP_INCLUDE)) {
grp->group_source_list,
srcnode, src)) {
igmp_source_forward_reevaluate_one(
- src);
+ pim, src);
} /* scan group sources */
} /* scan igmp groups */
} /* scan igmp sockets */
continue;
pim_rp_prefix_list_update(pim, plist);
- pim_ssm_prefix_list_update(plist);
+ pim_ssm_prefix_list_update(pim, plist);
pim_upstream_spt_prefix_list_update(pim, plist);
}
}