Skip to content

Commit 16607e2

Browse files
authored
Merge branch 'master' into redis_disabled_if_ZMQ
2 parents 8266bf7 + ebdf9e9 commit 16607e2

File tree

7 files changed

+120
-2
lines changed

7 files changed

+120
-2
lines changed

unittest/vslib/TestSwitchStateBase.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,3 +426,25 @@ TEST(SwitchStateBase, query_stats_st_capability)
426426
SAI_OBJECT_TYPE_PORT,
427427
&stats_capability));
428428
}
429+
430+
TEST_F(SwitchStateBaseTest, getObjectTypeAvailability)
431+
{
432+
// Test default implementation returns 0 for unsupported types
433+
uint64_t availability = m_ss->getObjectTypeAvailability(SAI_OBJECT_TYPE_MY_SID_ENTRY);
434+
EXPECT_EQ(availability, 0);
435+
}
436+
437+
TEST(SwitchStateBase, getObjectTypeAvailability_standalone)
438+
{
439+
auto sc = std::make_shared<SwitchConfig>(0, "");
440+
auto scc = std::make_shared<SwitchConfigContainer>();
441+
442+
SwitchStateBase ss(
443+
0x2100000000,
444+
std::make_shared<RealObjectIdManager>(0, scc),
445+
sc);
446+
447+
// Test that default implementation logs warning and returns 0
448+
uint64_t availability = ss.getObjectTypeAvailability(SAI_OBJECT_TYPE_MY_SID_ENTRY);
449+
EXPECT_EQ(availability, 0);
450+
}

unittest/vslib/TestVirtualSwitchSaiInterface.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,3 +449,37 @@ TEST_F(VirtualSwitchSaiInterfaceTest, switchDebugCounterCapabilityGet)
449449
);
450450
ASSERT_EQ(expectedDebugCounterTypes, actualDebugCounterTypes);
451451
}
452+
453+
TEST_F(VirtualSwitchSaiInterfaceTest, objectTypeGetAvailability_MySidEntry)
454+
{
455+
uint64_t count = 0;
456+
457+
// Test objectTypeGetAvailability for SAI_OBJECT_TYPE_MY_SID_ENTRY
458+
sai_status_t status = m_vssai->objectTypeGetAvailability(
459+
m_swid,
460+
SAI_OBJECT_TYPE_MY_SID_ENTRY,
461+
0, // attr_count
462+
nullptr, // attr_list
463+
&count);
464+
465+
EXPECT_EQ(status, SAI_STATUS_SUCCESS);
466+
// The availability should be returned based on the switch state implementation
467+
// For base implementation, it should return 0
468+
EXPECT_EQ(count, 0);
469+
}
470+
471+
TEST_F(VirtualSwitchSaiInterfaceTest, objectTypeGetAvailability_MySidEntry_InvalidSwitch)
472+
{
473+
uint64_t count = 0;
474+
sai_object_id_t invalid_switch_id = 0x123456789;
475+
476+
// Test with invalid switch ID - should return failure
477+
sai_status_t status = m_vssai->objectTypeGetAvailability(
478+
invalid_switch_id,
479+
SAI_OBJECT_TYPE_MY_SID_ENTRY,
480+
0,
481+
nullptr,
482+
&count);
483+
484+
EXPECT_EQ(status, SAI_STATUS_FAILURE);
485+
}

vslib/SwitchStateBase.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4394,6 +4394,16 @@ sai_status_t SwitchStateBase::queryAttributeCapability(
43944394
return SAI_STATUS_SUCCESS;
43954395
}
43964396

4397+
uint64_t SwitchStateBase::getObjectTypeAvailability(
4398+
_In_ sai_object_type_t object_type)
4399+
{
4400+
SWSS_LOG_ENTER();
4401+
4402+
// Default implementation - return 0 for unsupported types
4403+
SWSS_LOG_WARN("getObjectTypeAvailability not implemented for object type %d", object_type);
4404+
return 0;
4405+
}
4406+
43974407
sai_status_t SwitchStateBase::querySwitchStatsCapability(
43984408
_Inout_ sai_stat_capability_list_t *stats_capability)
43994409
{

vslib/SwitchStateBase.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,9 @@ namespace saivs
344344
_In_ sai_attr_id_t attr_id,
345345
_Out_ sai_attr_capability_t *attr_capability);
346346

347+
virtual uint64_t getObjectTypeAvailability(
348+
_In_ sai_object_type_t object_type);
349+
347350
protected:
348351

349352
virtual sai_status_t remove_internal(

vslib/VirtualSwitchSaiInterface.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,18 @@ sai_status_t VirtualSwitchSaiInterface::objectTypeGetAvailability(
878878
*count = 512;
879879
return SAI_STATUS_SUCCESS;
880880
}
881+
else if (objectType == SAI_OBJECT_TYPE_MY_SID_ENTRY)
882+
{
883+
if (m_switchStateMap.find(switchId) == m_switchStateMap.end())
884+
{
885+
SWSS_LOG_ERROR("failed to find switch %s in switch state map", sai_serialize_object_id(switchId).c_str());
886+
return SAI_STATUS_FAILURE;
887+
}
888+
889+
auto ss = m_switchStateMap.at(switchId);
890+
*count = ss->getObjectTypeAvailability(objectType);
891+
return SAI_STATUS_SUCCESS;
892+
}
881893
else if ((objectType == (sai_object_type_t)SAI_OBJECT_TYPE_VNET) ||
882894
(objectType == (sai_object_type_t)SAI_OBJECT_TYPE_ENI) ||
883895
(objectType == (sai_object_type_t)SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY) ||

vslib/vpp/SwitchVpp.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,21 @@ sai_status_t SwitchVpp::queryAttributeCapability(
744744
return SAI_STATUS_SUCCESS;
745745
}
746746

747+
uint64_t SwitchVpp::getObjectTypeAvailability(
748+
_In_ sai_object_type_t object_type)
749+
{
750+
SWSS_LOG_ENTER();
751+
752+
if (object_type == SAI_OBJECT_TYPE_MY_SID_ENTRY)
753+
{
754+
// Return available MY_SID entries (max - used)
755+
return static_cast<uint64_t>(m_maxMySidEntries - m_srv6_my_sid_count);
756+
}
757+
758+
// Return 0 for unsupported types
759+
return 0;
760+
}
761+
747762
sai_status_t SwitchVpp::getStatsExt(
748763
_In_ sai_object_type_t object_type,
749764
_In_ sai_object_id_t object_id,
@@ -819,7 +834,13 @@ sai_status_t SwitchVpp::create(
819834

820835
if (object_type == SAI_OBJECT_TYPE_MY_SID_ENTRY)
821836
{
822-
return m_tunnel_mgr_srv6.create_my_sid_entry(serializedObjectId, switch_id, attr_count, attr_list);
837+
sai_status_t status = m_tunnel_mgr_srv6.create_my_sid_entry(serializedObjectId, switch_id, attr_count, attr_list);
838+
if (status == SAI_STATUS_SUCCESS)
839+
{
840+
m_srv6_my_sid_count++;
841+
SWSS_LOG_DEBUG("MY_SID entry created, count: %u", m_srv6_my_sid_count);
842+
}
843+
return status;
823844
}
824845

825846
if (object_type == SAI_OBJECT_TYPE_SRV6_SIDLIST)
@@ -1056,7 +1077,16 @@ sai_status_t SwitchVpp::remove(
10561077

10571078
if (object_type == SAI_OBJECT_TYPE_MY_SID_ENTRY)
10581079
{
1059-
return m_tunnel_mgr_srv6.remove_my_sid_entry(serializedObjectId);
1080+
sai_status_t status = m_tunnel_mgr_srv6.remove_my_sid_entry(serializedObjectId);
1081+
if (status == SAI_STATUS_SUCCESS)
1082+
{
1083+
if (m_srv6_my_sid_count > 0)
1084+
{
1085+
m_srv6_my_sid_count--;
1086+
}
1087+
SWSS_LOG_DEBUG("MY_SID entry removed, count: %u", m_srv6_my_sid_count);
1088+
}
1089+
return status;
10601090
}
10611091

10621092
if (object_type == SAI_OBJECT_TYPE_SRV6_SIDLIST)

vslib/vpp/SwitchVpp.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ namespace saivs
9494
_In_ sai_attr_id_t attr_id,
9595
_Out_ sai_attr_capability_t *capability) override;
9696

97+
virtual uint64_t getObjectTypeAvailability(
98+
_In_ sai_object_type_t object_type) override;
99+
97100
virtual sai_status_t getStatsExt(
98101
_In_ sai_object_type_t object_type,
99102
_In_ sai_object_id_t object_id,
@@ -950,6 +953,10 @@ namespace saivs
950953

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

956+
// SRv6 object tracking for CRM
957+
constexpr static const int m_maxMySidEntries = 1000;
958+
uint32_t m_srv6_my_sid_count = 0;
959+
953960
std::shared_ptr<RealObjectIdManager> m_realObjectIdManager;
954961

955962
friend class TunnelManagerSRv6;

0 commit comments

Comments
 (0)