Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions unittest/vslib/TestSwitchStateBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -426,3 +426,25 @@ TEST(SwitchStateBase, query_stats_st_capability)
SAI_OBJECT_TYPE_PORT,
&stats_capability));
}

TEST_F(SwitchStateBaseTest, getObjectTypeAvailability)
{
// Test default implementation returns 0 for unsupported types
uint64_t availability = m_ss->getObjectTypeAvailability(SAI_OBJECT_TYPE_MY_SID_ENTRY);
EXPECT_EQ(availability, 0);
}

TEST(SwitchStateBase, getObjectTypeAvailability_standalone)
{
auto sc = std::make_shared<SwitchConfig>(0, "");
auto scc = std::make_shared<SwitchConfigContainer>();

SwitchStateBase ss(
0x2100000000,
std::make_shared<RealObjectIdManager>(0, scc),
sc);

// Test that default implementation logs warning and returns 0
uint64_t availability = ss.getObjectTypeAvailability(SAI_OBJECT_TYPE_MY_SID_ENTRY);
EXPECT_EQ(availability, 0);
}
34 changes: 34 additions & 0 deletions unittest/vslib/TestVirtualSwitchSaiInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -449,3 +449,37 @@ TEST_F(VirtualSwitchSaiInterfaceTest, switchDebugCounterCapabilityGet)
);
ASSERT_EQ(expectedDebugCounterTypes, actualDebugCounterTypes);
}

TEST_F(VirtualSwitchSaiInterfaceTest, objectTypeGetAvailability_MySidEntry)
{
uint64_t count = 0;

// Test objectTypeGetAvailability for SAI_OBJECT_TYPE_MY_SID_ENTRY
sai_status_t status = m_vssai->objectTypeGetAvailability(
m_swid,
SAI_OBJECT_TYPE_MY_SID_ENTRY,
0, // attr_count
nullptr, // attr_list
&count);

EXPECT_EQ(status, SAI_STATUS_SUCCESS);
// The availability should be returned based on the switch state implementation
// For base implementation, it should return 0
EXPECT_EQ(count, 0);
}

TEST_F(VirtualSwitchSaiInterfaceTest, objectTypeGetAvailability_MySidEntry_InvalidSwitch)
{
uint64_t count = 0;
sai_object_id_t invalid_switch_id = 0x123456789;

// Test with invalid switch ID - should return failure
sai_status_t status = m_vssai->objectTypeGetAvailability(
invalid_switch_id,
SAI_OBJECT_TYPE_MY_SID_ENTRY,
0,
nullptr,
&count);

EXPECT_EQ(status, SAI_STATUS_FAILURE);
}
10 changes: 10 additions & 0 deletions vslib/SwitchStateBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4394,6 +4394,16 @@ sai_status_t SwitchStateBase::queryAttributeCapability(
return SAI_STATUS_SUCCESS;
}

uint64_t SwitchStateBase::getObjectTypeAvailability(
_In_ sai_object_type_t object_type)
{
SWSS_LOG_ENTER();

// Default implementation - return 0 for unsupported types
SWSS_LOG_WARN("getObjectTypeAvailability not implemented for object type %d", object_type);
return 0;
}

sai_status_t SwitchStateBase::querySwitchStatsCapability(
_Inout_ sai_stat_capability_list_t *stats_capability)
{
Expand Down
3 changes: 3 additions & 0 deletions vslib/SwitchStateBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,9 @@ namespace saivs
_In_ sai_attr_id_t attr_id,
_Out_ sai_attr_capability_t *attr_capability);

virtual uint64_t getObjectTypeAvailability(
_In_ sai_object_type_t object_type);

protected:

virtual sai_status_t remove_internal(
Expand Down
12 changes: 12 additions & 0 deletions vslib/VirtualSwitchSaiInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -878,6 +878,18 @@ sai_status_t VirtualSwitchSaiInterface::objectTypeGetAvailability(
*count = 512;
return SAI_STATUS_SUCCESS;
}
else if (objectType == SAI_OBJECT_TYPE_MY_SID_ENTRY)
{
if (m_switchStateMap.find(switchId) == m_switchStateMap.end())
{
SWSS_LOG_ERROR("failed to find switch %s in switch state map", sai_serialize_object_id(switchId).c_str());
return SAI_STATUS_FAILURE;
}

auto ss = m_switchStateMap.at(switchId);
*count = ss->getObjectTypeAvailability(objectType);
return SAI_STATUS_SUCCESS;
}
else if ((objectType == (sai_object_type_t)SAI_OBJECT_TYPE_VNET) ||
(objectType == (sai_object_type_t)SAI_OBJECT_TYPE_ENI) ||
(objectType == (sai_object_type_t)SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY) ||
Expand Down
34 changes: 32 additions & 2 deletions vslib/vpp/SwitchVpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -744,6 +744,21 @@ sai_status_t SwitchVpp::queryAttributeCapability(
return SAI_STATUS_SUCCESS;
}

uint64_t SwitchVpp::getObjectTypeAvailability(
_In_ sai_object_type_t object_type)
{
SWSS_LOG_ENTER();

if (object_type == SAI_OBJECT_TYPE_MY_SID_ENTRY)
{
// Return available MY_SID entries (max - used)
return static_cast<uint64_t>(m_maxMySidEntries - m_srv6_my_sid_count);
}

// Return 0 for unsupported types
return 0;
}

sai_status_t SwitchVpp::getStatsExt(
_In_ sai_object_type_t object_type,
_In_ sai_object_id_t object_id,
Expand Down Expand Up @@ -819,7 +834,13 @@ sai_status_t SwitchVpp::create(

if (object_type == SAI_OBJECT_TYPE_MY_SID_ENTRY)
{
return m_tunnel_mgr_srv6.create_my_sid_entry(serializedObjectId, switch_id, attr_count, attr_list);
sai_status_t status = m_tunnel_mgr_srv6.create_my_sid_entry(serializedObjectId, switch_id, attr_count, attr_list);
if (status == SAI_STATUS_SUCCESS)
{
m_srv6_my_sid_count++;
SWSS_LOG_DEBUG("MY_SID entry created, count: %u", m_srv6_my_sid_count);
}
return status;
}

if (object_type == SAI_OBJECT_TYPE_SRV6_SIDLIST)
Expand Down Expand Up @@ -1056,7 +1077,16 @@ sai_status_t SwitchVpp::remove(

if (object_type == SAI_OBJECT_TYPE_MY_SID_ENTRY)
{
return m_tunnel_mgr_srv6.remove_my_sid_entry(serializedObjectId);
sai_status_t status = m_tunnel_mgr_srv6.remove_my_sid_entry(serializedObjectId);
if (status == SAI_STATUS_SUCCESS)
{
if (m_srv6_my_sid_count > 0)
{
m_srv6_my_sid_count--;
}
SWSS_LOG_DEBUG("MY_SID entry removed, count: %u", m_srv6_my_sid_count);
}
return status;
}

if (object_type == SAI_OBJECT_TYPE_SRV6_SIDLIST)
Expand Down
7 changes: 7 additions & 0 deletions vslib/vpp/SwitchVpp.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ namespace saivs
_In_ sai_attr_id_t attr_id,
_Out_ sai_attr_capability_t *capability) override;

virtual uint64_t getObjectTypeAvailability(
_In_ sai_object_type_t object_type) override;

virtual sai_status_t getStatsExt(
_In_ sai_object_type_t object_type,
_In_ sai_object_id_t object_id,
Expand Down Expand Up @@ -950,6 +953,10 @@ namespace saivs

std::map<std::string, std::shared_ptr<HostInterfaceInfo>> m_hostif_info_map;

// SRv6 object tracking for CRM
constexpr static const int m_maxMySidEntries = 1000;
uint32_t m_srv6_my_sid_count = 0;

std::shared_ptr<RealObjectIdManager> m_realObjectIdManager;

friend class TunnelManagerSRv6;
Expand Down
Loading