summaryrefslogtreecommitdiffstats
path: root/pimd/pim_macro.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2019-10-09 21:12:23 +0200
committerDonald Sharp <sharpd@cumulusnetworks.com>2020-03-06 22:13:28 +0100
commit4d114ab9f91fcac953e92e25b29192909b1a81bf (patch)
tree5174d0301db0bbc036ffb7fe072b72b258812b00 /pimd/pim_macro.c
parentpimd: fix problem with oif being re-added during ifchannel del (diff)
downloadfrr-4d114ab9f91fcac953e92e25b29192909b1a81bf.tar.xz
frr-4d114ab9f91fcac953e92e25b29192909b1a81bf.zip
pimd: Allow LHR in a AA situation to join upstream
Add a special catch to the test for pim_macro_chisin_pim_include to allow the LHR to signal interest in joining upstream. This will allow both the DR and non DR of the ActiveActive situation to draw traffic to itself. The non-DR will continue to not forward traffic. Ticket: CM-26610 Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'pimd/pim_macro.c')
-rw-r--r--pimd/pim_macro.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/pimd/pim_macro.c b/pimd/pim_macro.c
index ea3e1a244..c6961d30c 100644
--- a/pimd/pim_macro.c
+++ b/pimd/pim_macro.c
@@ -157,6 +157,7 @@ int pim_macro_ch_lost_assert(const struct pim_ifchannel *ch)
int pim_macro_chisin_pim_include(const struct pim_ifchannel *ch)
{
struct pim_interface *pim_ifp = ch->interface->info;
+ bool mlag_active = false;
if (!pim_ifp) {
zlog_warn("%s: (S,G)=%s: multicast not enabled on interface %s",
@@ -172,9 +173,21 @@ int pim_macro_chisin_pim_include(const struct pim_ifchannel *ch)
if (ch->ifassert_winner.s_addr == pim_ifp->primary_address.s_addr)
return 1; /* true */
+ /*
+ * When we have a activeactive interface we need to signal
+ * that this interface is interesting to the upstream
+ * decision to JOIN *if* we are syncing over the interface
+ */
+ if (pim_ifp->activeactive) {
+ struct pim_upstream *up = ch->upstream;
+
+ if (PIM_UPSTREAM_FLAG_TEST_MLAG_INTERFACE(up->flags))
+ mlag_active = true;
+ }
+
return (
/* I_am_DR( I ) ? */
- PIM_I_am_DR(pim_ifp) &&
+ (PIM_I_am_DR(pim_ifp) || mlag_active) &&
/* lost_assert(S,G,I) == false ? */
(!pim_macro_ch_lost_assert(ch)));
}