mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-04-28 15:36:25 +00:00
Merge pull request #13097 from AbhishekNR/mroute
pim6d: mroutes not created after disabling and enabling PIMv6.
This commit is contained in:
commit
635d65e2c8
@ -99,7 +99,7 @@ static inline uint8_t in6_multicast_scope(const pim_addr *addr)
|
|||||||
return addr->s6_addr[1] & 0xf;
|
return addr->s6_addr[1] & 0xf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool in6_multicast_nofwd(const pim_addr *addr)
|
bool in6_multicast_nofwd(const pim_addr *addr)
|
||||||
{
|
{
|
||||||
return in6_multicast_scope(addr) <= IPV6_MULTICAST_SCOPE_LINK;
|
return in6_multicast_scope(addr) <= IPV6_MULTICAST_SCOPE_LINK;
|
||||||
}
|
}
|
||||||
@ -182,13 +182,11 @@ DECLARE_HASH(gm_gsq_pends, struct gm_gsq_pending, itm, gm_gsq_pending_cmp,
|
|||||||
* interface -> (S,G)
|
* interface -> (S,G)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int gm_sg_cmp(const struct gm_sg *a, const struct gm_sg *b)
|
int gm_sg_cmp(const struct gm_sg *a, const struct gm_sg *b)
|
||||||
{
|
{
|
||||||
return pim_sgaddr_cmp(a->sgaddr, b->sgaddr);
|
return pim_sgaddr_cmp(a->sgaddr, b->sgaddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
DECLARE_RBTREE_UNIQ(gm_sgs, struct gm_sg, itm, gm_sg_cmp);
|
|
||||||
|
|
||||||
static struct gm_sg *gm_sg_find(struct gm_if *gm_ifp, pim_addr grp,
|
static struct gm_sg *gm_sg_find(struct gm_if *gm_ifp, pim_addr grp,
|
||||||
pim_addr src)
|
pim_addr src)
|
||||||
{
|
{
|
||||||
|
@ -113,6 +113,8 @@ struct gm_sg {
|
|||||||
*/
|
*/
|
||||||
struct gm_packet_sg *most_recent;
|
struct gm_packet_sg *most_recent;
|
||||||
};
|
};
|
||||||
|
int gm_sg_cmp(const struct gm_sg *a, const struct gm_sg *b);
|
||||||
|
DECLARE_RBTREE_UNIQ(gm_sgs, struct gm_sg, itm, gm_sg_cmp);
|
||||||
|
|
||||||
/* host tracking entry. addr will be one of:
|
/* host tracking entry. addr will be one of:
|
||||||
*
|
*
|
||||||
@ -352,5 +354,6 @@ static inline void gm_ifp_teardown(struct interface *ifp)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void gm_cli_init(void);
|
extern void gm_cli_init(void);
|
||||||
|
bool in6_multicast_nofwd(const pim_addr *addr);
|
||||||
|
|
||||||
#endif /* PIM6_MLD_H */
|
#endif /* PIM6_MLD_H */
|
||||||
|
@ -71,12 +71,19 @@ static void pim_if_membership_clear(struct interface *ifp)
|
|||||||
static void pim_if_membership_refresh(struct interface *ifp)
|
static void pim_if_membership_refresh(struct interface *ifp)
|
||||||
{
|
{
|
||||||
struct pim_interface *pim_ifp;
|
struct pim_interface *pim_ifp;
|
||||||
|
#if PIM_IPV == 4
|
||||||
struct listnode *grpnode;
|
struct listnode *grpnode;
|
||||||
struct gm_group *grp;
|
struct gm_group *grp;
|
||||||
|
#else
|
||||||
|
struct gm_if *gm_ifp;
|
||||||
|
struct gm_sg *sg, *sg_start;
|
||||||
|
#endif
|
||||||
|
|
||||||
pim_ifp = ifp->info;
|
pim_ifp = ifp->info;
|
||||||
assert(pim_ifp);
|
assert(pim_ifp);
|
||||||
|
#if PIM_IPV == 6
|
||||||
|
gm_ifp = pim_ifp->mld;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!pim_ifp->pim_enable)
|
if (!pim_ifp->pim_enable)
|
||||||
return;
|
return;
|
||||||
@ -90,6 +97,7 @@ static void pim_if_membership_refresh(struct interface *ifp)
|
|||||||
|
|
||||||
pim_ifchannel_membership_clear(ifp);
|
pim_ifchannel_membership_clear(ifp);
|
||||||
|
|
||||||
|
#if PIM_IPV == 4
|
||||||
/*
|
/*
|
||||||
* Then restore PIM (S,G) membership from all IGMPv3 (S,G) entries on
|
* Then restore PIM (S,G) membership from all IGMPv3 (S,G) entries on
|
||||||
* the interface
|
* the interface
|
||||||
@ -116,6 +124,16 @@ static void pim_if_membership_refresh(struct interface *ifp)
|
|||||||
|
|
||||||
} /* scan group sources */
|
} /* scan group sources */
|
||||||
} /* scan igmp groups */
|
} /* scan igmp groups */
|
||||||
|
#else
|
||||||
|
sg_start = gm_sgs_first(gm_ifp->sgs);
|
||||||
|
|
||||||
|
frr_each_from (gm_sgs, gm_ifp->sgs, sg, sg_start) {
|
||||||
|
if (!in6_multicast_nofwd(&sg->sgaddr.grp)) {
|
||||||
|
pim_ifchannel_local_membership_add(
|
||||||
|
ifp, &sg->sgaddr, false /*is_vxlan*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Finally delete every PIM (S,G) entry lacking all state info
|
* Finally delete every PIM (S,G) entry lacking all state info
|
||||||
|
Loading…
Reference in New Issue
Block a user