mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-02 16:57:25 +00:00
Merge pull request #5880 from patrasar/2371558
pimd: fix OIL not removed after IGMP prune
This commit is contained in:
commit
7967afda07
@ -1706,7 +1706,10 @@ static void pim_show_join_helper(struct vty *vty, struct pim_interface *pim_ifp,
|
|||||||
pim_ifchannel_ifjoin_name(ch->ifjoin_state, ch->flags));
|
pim_ifchannel_ifjoin_name(ch->ifjoin_state, ch->flags));
|
||||||
if (PIM_IF_FLAG_TEST_S_G_RPT(ch->flags))
|
if (PIM_IF_FLAG_TEST_S_G_RPT(ch->flags))
|
||||||
json_object_int_add(json_row, "SGRpt", 1);
|
json_object_int_add(json_row, "SGRpt", 1);
|
||||||
|
if (PIM_IF_FLAG_TEST_PROTO_PIM(ch->flags))
|
||||||
|
json_object_int_add(json_row, "protocolPim", 1);
|
||||||
|
if (PIM_IF_FLAG_TEST_PROTO_IGMP(ch->flags))
|
||||||
|
json_object_int_add(json_row, "protocolIgmp", 1);
|
||||||
json_object_object_get_ex(json_iface, ch_grp_str, &json_grp);
|
json_object_object_get_ex(json_iface, ch_grp_str, &json_grp);
|
||||||
if (!json_grp) {
|
if (!json_grp) {
|
||||||
json_grp = json_object_new_object();
|
json_grp = json_object_new_object();
|
||||||
|
@ -628,6 +628,12 @@ struct pim_ifchannel *pim_ifchannel_add(struct interface *ifp,
|
|||||||
up->dualactive_ifchannel_count, up->flags);
|
up->dualactive_ifchannel_count, up->flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (up_flags == PIM_UPSTREAM_FLAG_MASK_SRC_PIM)
|
||||||
|
PIM_IF_FLAG_SET_PROTO_PIM(ch->flags);
|
||||||
|
|
||||||
|
if (up_flags == PIM_UPSTREAM_FLAG_MASK_SRC_IGMP)
|
||||||
|
PIM_IF_FLAG_SET_PROTO_IGMP(ch->flags);
|
||||||
|
|
||||||
if (PIM_DEBUG_PIM_TRACE)
|
if (PIM_DEBUG_PIM_TRACE)
|
||||||
zlog_debug("%s: ifchannel %s(%s) is created ", __func__,
|
zlog_debug("%s: ifchannel %s(%s) is created ", __func__,
|
||||||
ch->sg_str, ch->interface->name);
|
ch->sg_str, ch->interface->name);
|
||||||
|
@ -69,13 +69,30 @@ struct pim_assert_metric {
|
|||||||
#define PIM_IF_FLAG_UNSET_ASSERT_TRACKING_DESIRED(flags) ((flags) &= ~PIM_IF_FLAG_MASK_ASSERT_TRACKING_DESIRED)
|
#define PIM_IF_FLAG_UNSET_ASSERT_TRACKING_DESIRED(flags) ((flags) &= ~PIM_IF_FLAG_MASK_ASSERT_TRACKING_DESIRED)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Flat to tell us if the ifchannel is (S,G,rpt)
|
* Flag to tell us if the ifchannel is (S,G,rpt)
|
||||||
*/
|
*/
|
||||||
#define PIM_IF_FLAG_MASK_S_G_RPT (1 << 2)
|
#define PIM_IF_FLAG_MASK_S_G_RPT (1 << 2)
|
||||||
#define PIM_IF_FLAG_TEST_S_G_RPT(flags) ((flags) & PIM_IF_FLAG_MASK_S_G_RPT)
|
#define PIM_IF_FLAG_TEST_S_G_RPT(flags) ((flags) & PIM_IF_FLAG_MASK_S_G_RPT)
|
||||||
#define PIM_IF_FLAG_SET_S_G_RPT(flags) ((flags) |= PIM_IF_FLAG_MASK_S_G_RPT)
|
#define PIM_IF_FLAG_SET_S_G_RPT(flags) ((flags) |= PIM_IF_FLAG_MASK_S_G_RPT)
|
||||||
#define PIM_IF_FLAG_UNSET_S_G_RPT(flags) ((flags) &= ~PIM_IF_FLAG_MASK_S_G_RPT)
|
#define PIM_IF_FLAG_UNSET_S_G_RPT(flags) ((flags) &= ~PIM_IF_FLAG_MASK_S_G_RPT)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flag to tell us if the ifchannel is proto PIM
|
||||||
|
*/
|
||||||
|
#define PIM_IF_FLAG_MASK_PROTO_PIM (1 << 3)
|
||||||
|
#define PIM_IF_FLAG_TEST_PROTO_PIM(flags) ((flags)&PIM_IF_FLAG_MASK_PROTO_PIM)
|
||||||
|
#define PIM_IF_FLAG_SET_PROTO_PIM(flags) ((flags) |= PIM_IF_FLAG_MASK_PROTO_PIM)
|
||||||
|
#define PIM_IF_FLAG_UNSET_PROTO_PIM(flags) \
|
||||||
|
((flags) &= ~PIM_IF_FLAG_MASK_PROTO_PIM)
|
||||||
|
/*
|
||||||
|
* Flag to tell us if the ifchannel is proto IGMP
|
||||||
|
*/
|
||||||
|
#define PIM_IF_FLAG_MASK_PROTO_IGMP (1 << 4)
|
||||||
|
#define PIM_IF_FLAG_TEST_PROTO_IGMP(flags) ((flags)&PIM_IF_FLAG_MASK_PROTO_IGMP)
|
||||||
|
#define PIM_IF_FLAG_SET_PROTO_IGMP(flags) \
|
||||||
|
((flags) |= PIM_IF_FLAG_MASK_PROTO_IGMP)
|
||||||
|
#define PIM_IF_FLAG_UNSET_PROTO_IGMP(flags) \
|
||||||
|
((flags) &= ~PIM_IF_FLAG_MASK_PROTO_IGMP)
|
||||||
/*
|
/*
|
||||||
Per-interface (S,G) state
|
Per-interface (S,G) state
|
||||||
*/
|
*/
|
||||||
|
@ -1794,10 +1794,16 @@ int pim_upstream_inherited_olist_decide(struct pim_instance *pim,
|
|||||||
continue;
|
continue;
|
||||||
if (pim_upstream_evaluate_join_desired_interface(up, ch,
|
if (pim_upstream_evaluate_join_desired_interface(up, ch,
|
||||||
starch)) {
|
starch)) {
|
||||||
int flag = PIM_OIF_FLAG_PROTO_PIM;
|
int flag = 0;
|
||||||
|
|
||||||
if (!ch)
|
if (!ch)
|
||||||
flag = PIM_OIF_FLAG_PROTO_STAR;
|
flag = PIM_OIF_FLAG_PROTO_STAR;
|
||||||
|
else {
|
||||||
|
if (PIM_IF_FLAG_TEST_PROTO_IGMP(ch->flags))
|
||||||
|
flag = PIM_OIF_FLAG_PROTO_IGMP;
|
||||||
|
if (PIM_IF_FLAG_TEST_PROTO_PIM(ch->flags))
|
||||||
|
flag |= PIM_OIF_FLAG_PROTO_PIM;
|
||||||
|
}
|
||||||
|
|
||||||
pim_channel_add_oif(up->channel_oil, ifp, flag,
|
pim_channel_add_oif(up->channel_oil, ifp, flag,
|
||||||
__func__);
|
__func__);
|
||||||
|
@ -835,7 +835,7 @@ void igmp_source_forward_stop(struct igmp_source *source)
|
|||||||
void pim_forward_start(struct pim_ifchannel *ch)
|
void pim_forward_start(struct pim_ifchannel *ch)
|
||||||
{
|
{
|
||||||
struct pim_upstream *up = ch->upstream;
|
struct pim_upstream *up = ch->upstream;
|
||||||
uint32_t mask = PIM_OIF_FLAG_PROTO_PIM;
|
uint32_t mask = 0;
|
||||||
|
|
||||||
if (PIM_DEBUG_PIM_TRACE) {
|
if (PIM_DEBUG_PIM_TRACE) {
|
||||||
char source_str[INET_ADDRSTRLEN];
|
char source_str[INET_ADDRSTRLEN];
|
||||||
@ -853,9 +853,12 @@ void pim_forward_start(struct pim_ifchannel *ch)
|
|||||||
inet_ntoa(up->upstream_addr));
|
inet_ntoa(up->upstream_addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (up->flags & PIM_UPSTREAM_FLAG_MASK_SRC_IGMP)
|
if (PIM_IF_FLAG_TEST_PROTO_IGMP(ch->flags))
|
||||||
mask = PIM_OIF_FLAG_PROTO_IGMP;
|
mask = PIM_OIF_FLAG_PROTO_IGMP;
|
||||||
|
|
||||||
|
if (PIM_IF_FLAG_TEST_PROTO_PIM(ch->flags))
|
||||||
|
mask |= PIM_OIF_FLAG_PROTO_PIM;
|
||||||
|
|
||||||
pim_channel_add_oif(up->channel_oil, ch->interface,
|
pim_channel_add_oif(up->channel_oil, ch->interface,
|
||||||
mask, __func__);
|
mask, __func__);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user