@@ -387,11 +387,20 @@ void VNetBitmapObject::recycleBitmapId(const string& vnet)
387387 }
388388}
389389
390- uint32_t VNetBitmapObject::getFreeTunnelRouteTableOffset ()
390+ uint32_t VNetBitmapObject::getFreeTunnelRouteTableOffset (IpPrefix ipPfx )
391391{
392392 SWSS_LOG_ENTER ();
393393
394- for (uint32_t i = 0 ; i < tunnelOffsets_.size (); i++)
394+ uint32_t offsetStart = VNET_ROUTE_FULL_MASK_OFFSET_MAX + 1 ;
395+ uint32_t offsetEnd = tunnelOffsets_.size ();
396+
397+ if (ipPfx.isFullMask ())
398+ {
399+ offsetStart = 0 ;
400+ offsetEnd = VNET_ROUTE_FULL_MASK_OFFSET_MAX;
401+ }
402+
403+ for (uint32_t i = offsetStart; i < offsetEnd; i++)
395404 {
396405 if (tunnelOffsets_[i] == false )
397406 {
@@ -1010,7 +1019,7 @@ bool VNetBitmapObject::addTunnelRoute(IpPrefix& ipPrefix, tunnelEndpoint& endp)
10101019 attr.value .s32 = SAI_TABLE_BITMAP_ROUTER_ENTRY_ACTION_TO_NEXTHOP;
10111020 tr_attrs.push_back (attr);
10121021
1013- tunnelRouteInfo.offset = getFreeTunnelRouteTableOffset ();
1022+ tunnelRouteInfo.offset = getFreeTunnelRouteTableOffset (ipPrefix );
10141023 attr.id = SAI_TABLE_BITMAP_ROUTER_ENTRY_ATTR_PRIORITY;
10151024 attr.value .u32 = tunnelRouteInfo.offset ;
10161025 tr_attrs.push_back (attr);
@@ -1227,7 +1236,7 @@ bool VNetBitmapObject::addRoute(IpPrefix& ipPrefix, nextHop& nh)
12271236 return true ;
12281237 }
12291238
1230- routeInfo.offset = getFreeTunnelRouteTableOffset ();
1239+ routeInfo.offset = getFreeTunnelRouteTableOffset (ipPrefix );
12311240 attr.id = SAI_TABLE_BITMAP_ROUTER_ENTRY_ATTR_PRIORITY;
12321241 attr.value .u32 = routeInfo.offset ;
12331242 attrs.push_back (attr);
0 commit comments