Skip to content

Commit 9aea929

Browse files
Volodymyr Samotiyprsunny
Volodymyr Samotiy
authored andcommitted
[vnetorch]: Fix tunnel route removal flow for bitmap VNET (sonic-net#912)
Signed-off-by: Volodymyr Samotiy <[email protected]>
1 parent cde242b commit 9aea929

File tree

2 files changed

+48
-7
lines changed

2 files changed

+48
-7
lines changed

orchagent/vnetorch.cpp

+37-6
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ std::bitset<VNET_TUNNEL_SIZE> VNetBitmapObject::tunnelIdOffsets_;
266266
map<string, uint32_t> VNetBitmapObject::vnetIds_;
267267
map<uint32_t, VnetBridgeInfo> VNetBitmapObject::bridgeInfoMap_;
268268
map<tuple<MacAddress, sai_object_id_t>, VnetNeighInfo> VNetBitmapObject::neighInfoMap_;
269-
map<tuple<IpAddress, sai_object_id_t>, uint16_t> VNetBitmapObject::endpointMap_;
269+
map<tuple<IpAddress, sai_object_id_t>, TunnelEndpointInfo> VNetBitmapObject::endpointMap_;
270270

271271
VNetBitmapObject::VNetBitmapObject(const std::string& vnet, const VNetInfo& vnetInfo,
272272
vector<sai_attribute_t>& attrs) : VNetObject(vnetInfo)
@@ -960,12 +960,12 @@ bool VNetBitmapObject::addTunnelRoute(IpPrefix& ipPrefix, tunnelEndpoint& endp)
960960
auto *tunnel = vxlan_orch->getVxlanTunnel(getTunnelName());
961961
auto endpoint = make_tuple(endp.ip, tunnel->getTunnelId());
962962
uint16_t tunnelIndex = 0;
963+
TunnelEndpointInfo endpointInfo;
963964
if (endpointMap_.find(endpoint) == endpointMap_.end())
964965
{
965966
tunnelIndex = getFreeTunnelId();
966967
vector<sai_attribute_t> vxlan_attrs;
967968

968-
sai_object_id_t tunnelL3VxlanEntryId;
969969
attr.id = SAI_TABLE_META_TUNNEL_ENTRY_ATTR_ACTION;
970970
attr.value.s32 = SAI_TABLE_META_TUNNEL_ENTRY_ACTION_TUNNEL_ENCAP;
971971
vxlan_attrs.push_back(attr);
@@ -983,7 +983,7 @@ bool VNetBitmapObject::addTunnelRoute(IpPrefix& ipPrefix, tunnelEndpoint& endp)
983983
vxlan_attrs.push_back(attr);
984984

985985
status = sai_bmtor_api->create_table_meta_tunnel_entry(
986-
&tunnelL3VxlanEntryId,
986+
&endpointInfo.metaTunnelEntryId,
987987
gSwitchId,
988988
(uint32_t)vxlan_attrs.size(),
989989
vxlan_attrs.data());
@@ -994,11 +994,14 @@ bool VNetBitmapObject::addTunnelRoute(IpPrefix& ipPrefix, tunnelEndpoint& endp)
994994
throw std::runtime_error("VNet route creation failed");
995995
}
996996

997-
endpointMap_.emplace(endpoint, tunnelIndex);
997+
endpointInfo.tunnelIndex = tunnelIndex;
998+
endpointInfo.use_count = 1;
999+
endpointMap_.emplace(endpoint, endpointInfo);
9981000
}
9991001
else
10001002
{
1001-
tunnelIndex = endpointMap_.at(endpoint);
1003+
tunnelIndex = endpointMap_.at(endpoint).tunnelIndex;
1004+
endpointMap_.at(endpoint).use_count++;
10021005
}
10031006

10041007
/* Tunnel route */
@@ -1049,6 +1052,8 @@ bool VNetBitmapObject::addTunnelRoute(IpPrefix& ipPrefix, tunnelEndpoint& endp)
10491052

10501053
tunnelRouteInfo.vni = endp.vni == 0 ? getVni() : endp.vni;
10511054
tunnelRouteInfo.mac = mac;
1055+
tunnelRouteInfo.ip = endp.ip;
1056+
tunnelRouteInfo.tunnelId = tunnel->getTunnelId();
10521057
tunnelRouteMap_.emplace(ipPrefix, tunnelRouteInfo);
10531058

10541059
return true;
@@ -1081,6 +1086,16 @@ bool VNetBitmapObject::removeTunnelRoute(IpPrefix& ipPrefix)
10811086
throw std::runtime_error("VNET tunnel route removal failed");
10821087
}
10831088

1089+
auto endpoint = make_tuple(tunnelRouteInfo.ip, tunnelRouteInfo.tunnelId);
1090+
1091+
if (endpointMap_.find(endpoint) == endpointMap_.end())
1092+
{
1093+
SWSS_LOG_ERROR("Tunnel endpoint doesn't exist for tunnel route %s", ipPrefix.to_string().c_str());
1094+
throw std::runtime_error("VNET tunnel route removal failed");
1095+
}
1096+
1097+
auto endpointInfo = endpointMap_.at(endpoint);
1098+
10841099
sai_status_t status;
10851100

10861101
status = sai_bmtor_api->remove_table_bitmap_router_entry(tunnelRouteInfo.tunnelRouteTableEntryId);
@@ -1090,6 +1105,23 @@ bool VNetBitmapObject::removeTunnelRoute(IpPrefix& ipPrefix)
10901105
throw std::runtime_error("VNET tunnel route removal failed");
10911106
}
10921107

1108+
if (endpointInfo.use_count > 1)
1109+
{
1110+
endpointInfo.use_count--;
1111+
}
1112+
else
1113+
{
1114+
status = sai_bmtor_api->remove_table_meta_tunnel_entry(endpointInfo.metaTunnelEntryId);
1115+
if (status != SAI_STATUS_SUCCESS)
1116+
{
1117+
SWSS_LOG_ERROR("Failed to remove meta tunnel entry for VNET tunnel route, SAI rc: %d", status);
1118+
throw std::runtime_error("VNET tunnel route removal failed");
1119+
}
1120+
1121+
recycleTunnelId(endpointInfo.tunnelIndex);
1122+
endpointMap_.erase(endpoint);
1123+
}
1124+
10931125
status = sai_next_hop_api->remove_next_hop(tunnelRouteInfo.nexthopId);
10941126
if (status != SAI_STATUS_SUCCESS)
10951127
{
@@ -1108,7 +1140,6 @@ bool VNetBitmapObject::removeTunnelRoute(IpPrefix& ipPrefix)
11081140
}
11091141

11101142
recycleTunnelRouteTableOffset(tunnelRouteInfo.offset);
1111-
11121143
tunnelRouteMap_.erase(ipPrefix);
11131144

11141145
return true;

orchagent/vnetorch.h

+11-1
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,10 @@ struct TunnelRouteInfo
184184
{
185185
sai_object_id_t tunnelRouteTableEntryId;
186186
sai_object_id_t nexthopId;
187+
sai_object_id_t tunnelId;
187188
uint32_t vni;
188189
MacAddress mac;
190+
IpAddress ip;
189191
uint32_t offset;
190192
};
191193

@@ -201,6 +203,14 @@ struct VnetIntfInfo
201203
map<IpPrefix, RouteInfo> pfxMap;
202204
};
203205

206+
207+
struct TunnelEndpointInfo
208+
{
209+
sai_object_id_t metaTunnelEntryId;
210+
uint16_t tunnelIndex;
211+
uint32_t use_count;
212+
};
213+
204214
class VNetBitmapObject: public VNetObject
205215
{
206216
public:
@@ -256,7 +266,7 @@ class VNetBitmapObject: public VNetObject
256266
static std::bitset<VNET_TUNNEL_SIZE> tunnelIdOffsets_;
257267
static map<uint32_t, VnetBridgeInfo> bridgeInfoMap_;
258268
static map<tuple<MacAddress, sai_object_id_t>, VnetNeighInfo> neighInfoMap_;
259-
static map<tuple<IpAddress, sai_object_id_t>, uint16_t> endpointMap_;
269+
static map<tuple<IpAddress, sai_object_id_t>, TunnelEndpointInfo> endpointMap_;
260270

261271
map<IpPrefix, RouteInfo> routeMap_;
262272
map<IpPrefix, TunnelRouteInfo> tunnelRouteMap_;

0 commit comments

Comments
 (0)