Skip to content

Commit c9f52c8

Browse files
committed
[vslib]: hostif enum capability query API support
vslib support for SAI_OBJECT_TYPE_HOSTIF_TRAP, attribute - SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE HLD: sonic-net/SONiC#1943 Signed-off-by: Ravi Minnikanti <[email protected]>
1 parent 41e4ca9 commit c9f52c8

2 files changed

Lines changed: 72 additions & 0 deletions

File tree

unittest/vslib/TestVirtualSwitchSaiInterface.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
#include <vector>
55
#include <array>
66

7+
extern "C" {
8+
#include "sai.h"
9+
#include "saimetadatautils.h"
10+
}
11+
712
#include <gtest/gtest.h>
813

914
#include "ContextConfigContainer.h"
@@ -235,3 +240,42 @@ TEST_F(VirtualSwitchSaiInterfaceTest, queryStatsStCapability)
235240
&stats_capability));
236241
EXPECT_EQ(stats_capability.list[0].minimal_polling_interval, static_cast<uint64_t>(1e6 * 100));
237242
}
243+
244+
TEST_F(VirtualSwitchSaiInterfaceTest, switchHostifTrapCapabilityGet)
245+
{
246+
sai_s32_list_t enum_values_capability = { .count = 0, .list = nullptr };
247+
248+
sai_status_t status = m_vssai->queryAttributeEnumValuesCapability(
249+
m_swid,
250+
SAI_OBJECT_TYPE_HOSTIF_TRAP,
251+
SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE,
252+
&enum_values_capability);
253+
254+
ASSERT_EQ(status, SAI_STATUS_BUFFER_OVERFLOW);
255+
256+
const auto* meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_HOSTIF_TRAP,
257+
SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE);
258+
assert(meta != NULL && meta->isenum);
259+
260+
size_t expected_enum_count = meta->enummetadata->valuescount;
261+
262+
std::vector<int32_t> values_list(expected_enum_count);
263+
enum_values_capability.count = static_cast<uint32_t>(values_list.size());
264+
enum_values_capability.list = values_list.data();
265+
266+
status = m_vssai->queryAttributeEnumValuesCapability(
267+
m_swid,
268+
SAI_OBJECT_TYPE_HOSTIF_TRAP,
269+
SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE,
270+
&enum_values_capability);
271+
272+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
273+
ASSERT_EQ(enum_values_capability.count, expected_enum_count);
274+
275+
for (uint32_t i = 0; i < enum_values_capability.count; ++i)
276+
{
277+
int32_t value = enum_values_capability.list[i];
278+
EXPECT_GE(value, SAI_HOSTIF_TRAP_TYPE_START);
279+
EXPECT_LE(value, SAI_HOSTIF_TRAP_TYPE_END);
280+
}
281+
}

vslib/VirtualSwitchSaiInterface.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,7 @@ sai_status_t VirtualSwitchSaiInterface::queryAttributeEnumValuesCapability(
922922
{
923923
if (enum_values_capability->count < 3)
924924
{
925+
enum_values_capability->count = 3;
925926
return SAI_STATUS_BUFFER_OVERFLOW;
926927
}
927928

@@ -936,6 +937,7 @@ sai_status_t VirtualSwitchSaiInterface::queryAttributeEnumValuesCapability(
936937
{
937938
if (enum_values_capability->count < 2)
938939
{
940+
enum_values_capability->count = 2;
939941
return SAI_STATUS_BUFFER_OVERFLOW;
940942
}
941943

@@ -949,6 +951,7 @@ sai_status_t VirtualSwitchSaiInterface::queryAttributeEnumValuesCapability(
949951
{
950952
if (enum_values_capability->count < 4)
951953
{
954+
enum_values_capability->count = 4;
952955
return SAI_STATUS_BUFFER_OVERFLOW;
953956
}
954957

@@ -960,6 +963,31 @@ sai_status_t VirtualSwitchSaiInterface::queryAttributeEnumValuesCapability(
960963

961964
return SAI_STATUS_SUCCESS;
962965
}
966+
else if (object_type == SAI_OBJECT_TYPE_HOSTIF_TRAP && attr_id == SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE)
967+
{
968+
auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_HOSTIF_TRAP, SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE);
969+
970+
if (meta == NULL || !meta->isenum)
971+
{
972+
SWSS_LOG_THROW("failed to find metadata for SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE attribute");
973+
}
974+
975+
if (enum_values_capability->count < meta->enummetadata->valuescount)
976+
{
977+
enum_values_capability->count = static_cast<uint32_t>(meta->enummetadata->valuescount);
978+
return SAI_STATUS_BUFFER_OVERFLOW;
979+
}
980+
981+
enum_values_capability->count = static_cast<uint32_t>(meta->enummetadata->valuescount);
982+
983+
for (uint32_t i = 0; i < enum_values_capability->count; i++)
984+
{
985+
enum_values_capability->list[i] = meta->enummetadata->values[i];
986+
}
987+
988+
return SAI_STATUS_SUCCESS;
989+
}
990+
963991
auto ss = m_switchStateMap.at(switch_id);
964992
return ss->queryAttrEnumValuesCapability(switch_id, object_type, attr_id, enum_values_capability);
965993

0 commit comments

Comments
 (0)