summaryrefslogtreecommitdiffstats
path: root/pimd/pim_vxlan.c
diff options
context:
space:
mode:
authorAnuradha Karuppiah <anuradhak@cumulusnetworks.com>2020-02-06 18:30:53 +0100
committerAnuradha Karuppiah <anuradhak@cumulusnetworks.com>2020-02-14 18:18:30 +0100
commit6823b1dcc3f302c38ae812a8d28c11d504464b4b (patch)
tree0614638b18b41de733042e409bf9b6a4ad325a2b /pimd/pim_vxlan.c
parentpimd: stop overloading SRC_IGMP upstream for vxlan local membership (diff)
downloadfrr-6823b1dcc3f302c38ae812a8d28c11d504464b4b.tar.xz
frr-6823b1dcc3f302c38ae812a8d28c11d504464b4b.zip
pimd: remove peerlink_rif from the orig-mroute OIL when it is oper down
In an anycast VTEP setup the peerlink_rif is added as a static OIF to the originating mroute (bypassing the pim state machine). This is needed to ensure both MLAG switches rx a copy of encapsulated BUM flow. We were not handling link state changes on this static OIF resulting in the wrong vifi being used in the OIL (because of vifi re-allocation). This commit re-acts to oper state changes by deleting the OIF on link down and re-adding it on link up. Signed-off-by: Anuradha Karuppiah <anuradhak@cumulusnetworks.com>
Diffstat (limited to 'pimd/pim_vxlan.c')
-rw-r--r--pimd/pim_vxlan.c57
1 files changed, 34 insertions, 23 deletions
diff --git a/pimd/pim_vxlan.c b/pimd/pim_vxlan.c
index 41a57c267..bd6998c4b 100644
--- a/pimd/pim_vxlan.c
+++ b/pimd/pim_vxlan.c
@@ -788,7 +788,8 @@ bool pim_vxlan_do_mlag_reg(void)
* to the MLAG peer which may mroute it over the underlay if there are any
* interested receivers.
*/
-static void pim_vxlan_sg_peerlink_update(struct hash_backet *backet, void *arg)
+static void pim_vxlan_sg_peerlink_oif_update(struct hash_backet *backet,
+ void *arg)
{
struct interface *new_oif = (struct interface *)arg;
struct pim_vxlan_sg *vxlan_sg = (struct pim_vxlan_sg *)backet->data;
@@ -827,8 +828,6 @@ void pim_vxlan_mlag_update(bool enable, bool peer_state, uint32_t role,
struct in_addr *reg_addr)
{
struct pim_instance *pim;
- struct interface *old_oif;
- struct interface *new_oif;
char addr_buf[INET_ADDRSTRLEN];
struct pim_interface *pim_ifp = NULL;
@@ -848,8 +847,6 @@ void pim_vxlan_mlag_update(bool enable, bool peer_state, uint32_t role,
*/
pim = pim_get_pim_instance(VRF_DEFAULT);
- old_oif = pim_vxlan_orig_mr_oif_get(pim);
-
if (enable)
vxlan_mlag.flags |= PIM_VXLAN_MLAGF_ENABLED;
else
@@ -870,11 +867,6 @@ void pim_vxlan_mlag_update(bool enable, bool peer_state, uint32_t role,
pim_vxlan_set_peerlink_rif(pim, peerlink_rif);
else
pim_vxlan_set_peerlink_rif(pim, NULL);
-
- new_oif = pim_vxlan_orig_mr_oif_get(pim);
- if (old_oif != new_oif)
- hash_iterate(pim->vxlan.sg_hash, pim_vxlan_sg_peerlink_update,
- new_oif);
}
/****************************** misc callbacks *******************************/
@@ -972,6 +964,9 @@ static void pim_vxlan_set_peerlink_rif(struct pim_instance *pim,
struct interface *ifp)
{
struct interface *old_iif;
+ struct interface *new_iif;
+ struct interface *old_oif;
+ struct interface *new_oif;
if (pim->vxlan.peerlink_rif == ifp)
return;
@@ -983,22 +978,38 @@ static void pim_vxlan_set_peerlink_rif(struct pim_instance *pim,
ifp ? ifp->name : "-");
old_iif = pim_vxlan_orig_mr_iif_get(pim);
+ old_oif = pim_vxlan_orig_mr_oif_get(pim);
pim->vxlan.peerlink_rif = ifp;
- ifp = pim_vxlan_orig_mr_iif_get(pim);
- if (old_iif == ifp)
- return;
- if (PIM_DEBUG_VXLAN)
- zlog_debug("%s: vxlan orig iif changed from %s to %s",
- __PRETTY_FUNCTION__, old_iif ? old_iif->name : "-",
- ifp ? ifp->name : "-");
+ new_iif = pim_vxlan_orig_mr_iif_get(pim);
+ if (old_iif != new_iif) {
+ if (PIM_DEBUG_VXLAN)
+ zlog_debug("%s: vxlan orig iif changed from %s to %s",
+ __PRETTY_FUNCTION__,
+ old_iif ? old_iif->name : "-",
+ new_iif ? new_iif->name : "-");
- /* add/del upstream entries for the existing vxlan SG when the
- * interface becomes available
- */
- if (pim->vxlan.sg_hash)
- hash_iterate(pim->vxlan.sg_hash,
- pim_vxlan_sg_peerlink_rif_update, old_iif);
+ /* add/del upstream entries for the existing vxlan SG when the
+ * interface becomes available
+ */
+ if (pim->vxlan.sg_hash)
+ hash_iterate(pim->vxlan.sg_hash,
+ pim_vxlan_sg_peerlink_rif_update,
+ old_iif);
+ }
+
+ new_oif = pim_vxlan_orig_mr_oif_get(pim);
+ if (old_oif != new_oif) {
+ if (PIM_DEBUG_VXLAN)
+ zlog_debug("%s: vxlan orig oif changed from %s to %s",
+ __PRETTY_FUNCTION__,
+ old_oif ? old_oif->name : "-",
+ new_oif ? new_oif->name : "-");
+ if (pim->vxlan.sg_hash)
+ hash_iterate(pim->vxlan.sg_hash,
+ pim_vxlan_sg_peerlink_oif_update,
+ new_oif);
+ }
}
void pim_vxlan_add_vif(struct interface *ifp)