From cdffff315f10f79d4f68668540cb80c32d84c9ea Mon Sep 17 00:00:00 2001 From: Volodymyr Samotiy Date: Mon, 11 May 2020 21:55:59 +0300 Subject: [PATCH] [vnet] Fix IP2ME route creation logic for BITMAP VNET interface (#1284) * [vnet] Fix IP2ME route creation logic for BITMAP VNET interface --- orchagent/intfsorch.cpp | 17 +++++++++++++++++ orchagent/intfsorch.h | 2 ++ orchagent/vnetorch.cpp | 4 ++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/orchagent/intfsorch.cpp b/orchagent/intfsorch.cpp index 0faf0ddb3c33..bfb54307683b 100644 --- a/orchagent/intfsorch.cpp +++ b/orchagent/intfsorch.cpp @@ -1094,6 +1094,23 @@ void IntfsOrch::generateInterfaceMap() m_updateMapsTimer->start(); } +bool IntfsOrch::updateSyncdIntfPfx(const string &alias, const IpPrefix &ip_prefix, bool add) +{ + if (add && m_syncdIntfses[alias].ip_addresses.count(ip_prefix) == 0) + { + m_syncdIntfses[alias].ip_addresses.insert(ip_prefix); + return true; + } + + if (!add && m_syncdIntfses[alias].ip_addresses.count(ip_prefix) > 0) + { + m_syncdIntfses[alias].ip_addresses.erase(ip_prefix); + return true; + } + + return false; +} + void IntfsOrch::doTask(SelectableTimer &timer) { SWSS_LOG_ENTER(); diff --git a/orchagent/intfsorch.h b/orchagent/intfsorch.h index 8209b5cfa126..9b2716eb1e01 100644 --- a/orchagent/intfsorch.h +++ b/orchagent/intfsorch.h @@ -60,6 +60,8 @@ class IntfsOrch : public Orch return m_syncdIntfses; } + bool updateSyncdIntfPfx(const string &alias, const IpPrefix &ip_prefix, bool add = true); + private: SelectableTimer* m_updateMapsTimer = nullptr; diff --git a/orchagent/vnetorch.cpp b/orchagent/vnetorch.cpp index e2167fbeab23..00b7494e02e0 100644 --- a/orchagent/vnetorch.cpp +++ b/orchagent/vnetorch.cpp @@ -717,7 +717,7 @@ bool VNetBitmapObject::addIntf(const string& alias, const IpPrefix *prefix) intfMap_.emplace(alias, intfInfo); } - if (prefix) + if (prefix && gIntfsOrch->updateSyncdIntfPfx(alias, *prefix)) { gIntfsOrch->addIp2MeRoute(gVirtualRouterId, *prefix); } @@ -739,7 +739,7 @@ bool VNetBitmapObject::removeIntf(const string& alias, const IpPrefix *prefix) auto& intf = intfMap_.at(alias); - if (prefix) + if (prefix && gIntfsOrch->updateSyncdIntfPfx(alias, *prefix, false)) { gIntfsOrch->removeIp2MeRoute(gVirtualRouterId, *prefix); }