pimd: make igmp_source_forward_reevaluate_all vrf aware

There is no need to look at all VRF's when we need to
reevaluate the source forward since the calling function
knows the vrf.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2018-03-17 21:16:42 -04:00
parent da11e32521
commit 5d59e40841
3 changed files with 29 additions and 37 deletions

View File

@ -48,7 +48,7 @@ static void pim_ssm_range_reevaluate(struct pim_instance *pim)
* disappear in time for SSM groups. * disappear in time for SSM groups.
*/ */
pim_upstream_register_reevaluate(pim); pim_upstream_register_reevaluate(pim);
igmp_source_forward_reevaluate_all(); igmp_source_forward_reevaluate_all(pim);
} }
void pim_ssm_prefix_list_update(struct pim_instance *pim, void pim_ssm_prefix_list_update(struct pim_instance *pim,

View File

@ -824,48 +824,40 @@ static void igmp_source_forward_reevaluate_one(struct pim_instance *pim,
} }
} }
void igmp_source_forward_reevaluate_all(void) void igmp_source_forward_reevaluate_all(struct pim_instance *pim)
{ {
struct interface *ifp; struct interface *ifp;
struct vrf *vrf;
struct pim_instance *pim;
RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) { FOR_ALL_INTERFACES (pim->vrf, ifp) {
pim = vrf->info; struct pim_interface *pim_ifp = ifp->info;
if (!pim) struct listnode *sock_node;
struct igmp_sock *igmp;
if (!pim_ifp)
continue; continue;
FOR_ALL_INTERFACES (pim->vrf, ifp) { /* scan igmp sockets */
struct pim_interface *pim_ifp = ifp->info; for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node,
struct listnode *sock_node; igmp)) {
struct igmp_sock *igmp; struct listnode *grpnode;
struct igmp_group *grp;
if (!pim_ifp) /* scan igmp groups */
continue; for (ALL_LIST_ELEMENTS_RO(igmp->igmp_group_list,
grpnode, grp)) {
struct listnode *srcnode;
struct igmp_source *src;
/* scan igmp sockets */ /* scan group sources */
for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, for (ALL_LIST_ELEMENTS_RO(
sock_node, igmp)) { grp->group_source_list, srcnode,
struct listnode *grpnode; src)) {
struct igmp_group *grp; igmp_source_forward_reevaluate_one(pim,
src);
/* scan igmp groups */ } /* scan group sources */
for (ALL_LIST_ELEMENTS_RO(igmp->igmp_group_list, } /* scan igmp groups */
grpnode, grp)) { } /* scan igmp sockets */
struct listnode *srcnode; } /* scan interfaces */
struct igmp_source *src;
/* scan group sources */
for (ALL_LIST_ELEMENTS_RO(
grp->group_source_list,
srcnode, src)) {
igmp_source_forward_reevaluate_one(
pim, src);
} /* scan group sources */
} /* scan igmp groups */
} /* scan igmp sockets */
} /* scan interfaces */
}
} }
void igmp_source_forward_start(struct pim_instance *pim, void igmp_source_forward_start(struct pim_instance *pim,

View File

@ -39,7 +39,7 @@ void igmp_anysource_forward_stop(struct igmp_group *group);
void igmp_source_forward_start(struct pim_instance *pim, void igmp_source_forward_start(struct pim_instance *pim,
struct igmp_source *source); struct igmp_source *source);
void igmp_source_forward_stop(struct igmp_source *source); void igmp_source_forward_stop(struct igmp_source *source);
void igmp_source_forward_reevaluate_all(void); void igmp_source_forward_reevaluate_all(struct pim_instance *pim);
void pim_forward_start(struct pim_ifchannel *ch); void pim_forward_start(struct pim_ifchannel *ch);
void pim_forward_stop(struct pim_ifchannel *ch, bool install_it); void pim_forward_stop(struct pim_ifchannel *ch, bool install_it);