From: Anuradha Karuppiah Date: Tue, 26 Mar 2019 20:38:53 +0000 (-0700) Subject: pimd: allow mroutes with IIF in the OIL X-Git-Tag: 7.1_pulled~55^2~30 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=7d9733230b179d1e9d34ee00ba34d03c14e95cb3;p=mirror%2Ffrr.git pimd: allow mroutes with IIF in the OIL This is specifically needed to allow pim-evpn mroutes in the MLAG setup - (36.0.0.11, 239.1.1.100) Iif: peerlink.4094 Oifs: uplink-1, peerlink.4094 I could have gone the other way and disabled PIM_ENFORCE_LOOPFREE_MFC but that opens the door too wide. Relaxing the checks for mlag-specific mroutes seemed like the safer choice. This commit provides the infrastructure to relax checks on a per-mroute basis. Signed-off-by: Anuradha Karuppiah --- diff --git a/pimd/pim_oil.c b/pimd/pim_oil.c index 55d26113f7..5945bc55fd 100644 --- a/pimd/pim_oil.c +++ b/pimd/pim_oil.c @@ -320,6 +320,7 @@ int pim_channel_add_oif(struct channel_oil *channel_oil, struct interface *oif, { struct pim_interface *pim_ifp; int old_ttl; + bool allow_iif_in_oil = false; /* * If we've gotten here we've gone bad, but let's @@ -344,7 +345,14 @@ int pim_channel_add_oif(struct channel_oil *channel_oil, struct interface *oif, by both source and receiver attached to the same interface. See TODO T22. */ - if (pim_ifp->mroute_vif_index == channel_oil->oil.mfcc_parent) { + if (channel_oil->up && + PIM_UPSTREAM_FLAG_TEST_ALLOW_IIF_IN_OIL( + channel_oil->up->flags)) { + allow_iif_in_oil = true; + } + + if (!allow_iif_in_oil && + pim_ifp->mroute_vif_index == channel_oil->oil.mfcc_parent) { channel_oil->oil_inherited_rescan = 1; if (PIM_DEBUG_MROUTE) { char group_str[INET_ADDRSTRLEN]; diff --git a/pimd/pim_upstream.h b/pimd/pim_upstream.h index c0bd9137d4..8dc2f7635c 100644 --- a/pimd/pim_upstream.h +++ b/pimd/pim_upstream.h @@ -48,6 +48,7 @@ * value specified and preventing next-hop-tracking on the entry */ #define PIM_UPSTREAM_FLAG_MASK_STATIC_IIF (1 << 10) +#define PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL (1 << 11) #define PIM_UPSTREAM_FLAG_ALL 0xFFFFFFFF #define PIM_UPSTREAM_FLAG_TEST_DR_JOIN_DESIRED(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED) @@ -61,6 +62,7 @@ #define PIM_UPSTREAM_FLAG_TEST_SRC_LHR(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_LHR) #define PIM_UPSTREAM_FLAG_TEST_DISABLE_KAT_EXPIRY(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY) #define PIM_UPSTREAM_FLAG_TEST_STATIC_IIF(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_STATIC_IIF) +#define PIM_UPSTREAM_FLAG_TEST_ALLOW_IIF_IN_OIL(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL) #define PIM_UPSTREAM_FLAG_SET_DR_JOIN_DESIRED(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED) #define PIM_UPSTREAM_FLAG_SET_DR_JOIN_DESIRED_UPDATED(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED) @@ -73,6 +75,7 @@ #define PIM_UPSTREAM_FLAG_SET_SRC_LHR(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_LHR) #define PIM_UPSTREAM_FLAG_SET_DISABLE_KAT_EXPIRY(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY) #define PIM_UPSTREAM_FLAG_SET_STATIC_IIF(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_STATIC_IIF) +#define PIM_UPSTREAM_FLAG_SET_ALLOW_IIF_IN_OIL(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL) #define PIM_UPSTREAM_FLAG_UNSET_DR_JOIN_DESIRED(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED) #define PIM_UPSTREAM_FLAG_UNSET_DR_JOIN_DESIRED_UPDATED(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED) @@ -85,6 +88,7 @@ #define PIM_UPSTREAM_FLAG_UNSET_SRC_LHR(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_LHR) #define PIM_UPSTREAM_FLAG_UNSET_DISABLE_KAT_EXPIRY(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY) #define PIM_UPSTREAM_FLAG_UNSET_STATIC_IIF(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_STATIC_IIF) +#define PIM_UPSTREAM_FLAG_UNSET_ALLOW_IIF_IN_OIL(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL) enum pim_upstream_state { PIM_UPSTREAM_NOTJOINED,