summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2020-03-17 18:40:53 +0100
committerGitHub <noreply@github.com>2020-03-17 18:40:53 +0100
commit7967afda0799711bf4ce3bfe8b8b51ceb179376e (patch)
tree10c8375b68a214451ce4c3759311b8d37353ddd9
parentMerge pull request #5779 from mjstapp/sharp_with_lsps (diff)
parentpimd: fix OIL not removed after IGMP prune (diff)
downloadfrr-7967afda0799711bf4ce3bfe8b8b51ceb179376e.tar.xz
frr-7967afda0799711bf4ce3bfe8b8b51ceb179376e.zip
Merge pull request #5880 from patrasar/2371558
pimd: fix OIL not removed after IGMP prune
-rw-r--r--pimd/pim_cmd.c5
-rw-r--r--pimd/pim_ifchannel.c6
-rw-r--r--pimd/pim_ifchannel.h19
-rw-r--r--pimd/pim_upstream.c8
-rw-r--r--pimd/pim_zebra.c7
5 files changed, 40 insertions, 5 deletions
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c
index 7e24d924a..fc8778fd8 100644
--- a/pimd/pim_cmd.c
+++ b/pimd/pim_cmd.c
@@ -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));
if (PIM_IF_FLAG_TEST_S_G_RPT(ch->flags))
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);
if (!json_grp) {
json_grp = json_object_new_object();
diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c
index 44d4ee719..70e06ccc4 100644
--- a/pimd/pim_ifchannel.c
+++ b/pimd/pim_ifchannel.c
@@ -628,6 +628,12 @@ struct pim_ifchannel *pim_ifchannel_add(struct interface *ifp,
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)
zlog_debug("%s: ifchannel %s(%s) is created ", __func__,
ch->sg_str, ch->interface->name);
diff --git a/pimd/pim_ifchannel.h b/pimd/pim_ifchannel.h
index 3d5cbd8ec..425622b79 100644
--- a/pimd/pim_ifchannel.h
+++ b/pimd/pim_ifchannel.h
@@ -69,7 +69,7 @@ struct pim_assert_metric {
#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_TEST_S_G_RPT(flags) ((flags) & PIM_IF_FLAG_MASK_S_G_RPT)
@@ -77,6 +77,23 @@ struct pim_assert_metric {
#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
*/
struct pim_ifchannel {
diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c
index efa58c1b1..07f8315a1 100644
--- a/pimd/pim_upstream.c
+++ b/pimd/pim_upstream.c
@@ -1794,10 +1794,16 @@ int pim_upstream_inherited_olist_decide(struct pim_instance *pim,
continue;
if (pim_upstream_evaluate_join_desired_interface(up, ch,
starch)) {
- int flag = PIM_OIF_FLAG_PROTO_PIM;
+ int flag = 0;
if (!ch)
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,
__func__);
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c
index e791500ed..8355c2099 100644
--- a/pimd/pim_zebra.c
+++ b/pimd/pim_zebra.c
@@ -835,7 +835,7 @@ void igmp_source_forward_stop(struct igmp_source *source)
void pim_forward_start(struct pim_ifchannel *ch)
{
struct pim_upstream *up = ch->upstream;
- uint32_t mask = PIM_OIF_FLAG_PROTO_PIM;
+ uint32_t mask = 0;
if (PIM_DEBUG_PIM_TRACE) {
char source_str[INET_ADDRSTRLEN];
@@ -853,9 +853,12 @@ void pim_forward_start(struct pim_ifchannel *ch)
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;
+ if (PIM_IF_FLAG_TEST_PROTO_PIM(ch->flags))
+ mask |= PIM_OIF_FLAG_PROTO_PIM;
+
pim_channel_add_oif(up->channel_oil, ch->interface,
mask, __func__);
}