Skip to content

Commit 859d6f8

Browse files
committed
[vslib]: hostif enum capability query API support
1. vslib support for SAI_OBJECT_TYPE_HOSTIF_TRAP, attribute - SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE 2. Added UT for SAI_OBJECT_TYPE_HOSTIF_TRAP 3. Added UT for SAI_OBJECT_TYPE_DEBUG_COUNTER HLD: sonic-net/SONiC#1943 Signed-off-by: Ravi Minnikanti <[email protected]>
1 parent 4152366 commit 859d6f8

File tree

2 files changed

+179
-0
lines changed

2 files changed

+179
-0
lines changed

unittest/vslib/TestVirtualSwitchSaiInterface.cpp

Lines changed: 151 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,149 @@ 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+
const auto* meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_HOSTIF_TRAP,
249+
SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE);
250+
assert(meta != NULL && meta->isenum);
251+
252+
size_t expected_enum_count = meta->enummetadata->valuescount;
253+
254+
sai_status_t status = m_vssai->queryAttributeEnumValuesCapability(
255+
m_swid,
256+
SAI_OBJECT_TYPE_HOSTIF_TRAP,
257+
SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE,
258+
&enum_values_capability);
259+
260+
ASSERT_EQ(status, SAI_STATUS_BUFFER_OVERFLOW);
261+
ASSERT_EQ(enum_values_capability.count, expected_enum_count);
262+
263+
std::vector<int32_t> values_list(expected_enum_count);
264+
enum_values_capability.count = static_cast<uint32_t>(values_list.size());
265+
enum_values_capability.list = values_list.data();
266+
267+
status = m_vssai->queryAttributeEnumValuesCapability(
268+
m_swid,
269+
SAI_OBJECT_TYPE_HOSTIF_TRAP,
270+
SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE,
271+
&enum_values_capability);
272+
273+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
274+
ASSERT_EQ(enum_values_capability.count, expected_enum_count);
275+
276+
for (uint32_t i = 0; i < enum_values_capability.count; ++i)
277+
{
278+
int32_t value = enum_values_capability.list[i];
279+
EXPECT_GE(value, SAI_HOSTIF_TRAP_TYPE_START);
280+
EXPECT_LE(value, SAI_HOSTIF_TRAP_TYPE_END);
281+
}
282+
}
283+
284+
TEST_F(VirtualSwitchSaiInterfaceTest, switchDebugCounterCapabilityGet)
285+
{
286+
sai_s32_list_t enum_values_capability = { .count = 0, .list = nullptr };
287+
288+
ASSERT_EQ(SAI_STATUS_BUFFER_OVERFLOW,
289+
m_vssai->queryAttributeEnumValuesCapability(
290+
m_swid,
291+
SAI_OBJECT_TYPE_DEBUG_COUNTER,
292+
SAI_DEBUG_COUNTER_ATTR_IN_DROP_REASON_LIST,
293+
&enum_values_capability));
294+
ASSERT_EQ(enum_values_capability.count, 3);
295+
296+
std::vector<sai_int32_t> haList(enum_values_capability.count);
297+
enum_values_capability.list = haList.data();
298+
299+
ASSERT_EQ(SAI_STATUS_SUCCESS,
300+
m_vssai->queryAttributeEnumValuesCapability(
301+
m_swid,
302+
SAI_OBJECT_TYPE_DEBUG_COUNTER,
303+
SAI_DEBUG_COUNTER_ATTR_IN_DROP_REASON_LIST,
304+
&enum_values_capability));
305+
ASSERT_EQ(enum_values_capability.count, 3);
306+
307+
const std::set<sai_in_drop_reason_t> expectedInDropReasons = {
308+
SAI_IN_DROP_REASON_L2_ANY,
309+
SAI_IN_DROP_REASON_L3_ANY,
310+
SAI_IN_DROP_REASON_ACL_ANY
311+
};
312+
313+
std::set<sai_in_drop_reason_t> actualInDropReasons;
314+
std::transform(
315+
haList.cbegin(), haList.cend(),
316+
std::inserter(actualInDropReasons, actualInDropReasons.begin()),
317+
[](sai_int32_t value) { return static_cast<sai_in_drop_reason_t>(value); }
318+
);
319+
ASSERT_EQ(expectedInDropReasons, actualInDropReasons);
320+
321+
enum_values_capability.count = 1;
322+
ASSERT_EQ(SAI_STATUS_BUFFER_OVERFLOW,
323+
m_vssai->queryAttributeEnumValuesCapability(
324+
m_swid,
325+
SAI_OBJECT_TYPE_DEBUG_COUNTER,
326+
SAI_DEBUG_COUNTER_ATTR_OUT_DROP_REASON_LIST,
327+
&enum_values_capability));
328+
ASSERT_EQ(enum_values_capability.count, 2);
329+
330+
haList.resize(enum_values_capability.count);
331+
enum_values_capability.list = haList.data();
332+
333+
ASSERT_EQ(SAI_STATUS_SUCCESS,
334+
m_vssai->queryAttributeEnumValuesCapability(
335+
m_swid,
336+
SAI_OBJECT_TYPE_DEBUG_COUNTER,
337+
SAI_DEBUG_COUNTER_ATTR_OUT_DROP_REASON_LIST,
338+
&enum_values_capability));
339+
ASSERT_EQ(enum_values_capability.count, 2);
340+
341+
const std::set<sai_out_drop_reason_t> expectedOutDropReasons = {
342+
SAI_OUT_DROP_REASON_L2_ANY,
343+
SAI_OUT_DROP_REASON_L3_ANY
344+
};
345+
346+
std::set<sai_out_drop_reason_t> actualOutDropReasons;
347+
std::transform(
348+
haList.cbegin(), haList.cend(),
349+
std::inserter(actualOutDropReasons, actualOutDropReasons.begin()),
350+
[](sai_int32_t value) { return static_cast<sai_out_drop_reason_t>(value); }
351+
);
352+
ASSERT_EQ(expectedOutDropReasons, actualOutDropReasons);
353+
354+
enum_values_capability.count = 3;
355+
ASSERT_EQ(SAI_STATUS_BUFFER_OVERFLOW,
356+
m_vssai->queryAttributeEnumValuesCapability(
357+
m_swid,
358+
SAI_OBJECT_TYPE_DEBUG_COUNTER,
359+
SAI_DEBUG_COUNTER_ATTR_TYPE,
360+
&enum_values_capability));
361+
ASSERT_EQ(enum_values_capability.count, 4);
362+
363+
haList.resize(enum_values_capability.count);
364+
enum_values_capability.list = haList.data();
365+
366+
ASSERT_EQ(SAI_STATUS_SUCCESS,
367+
m_vssai->queryAttributeEnumValuesCapability(
368+
m_swid,
369+
SAI_OBJECT_TYPE_DEBUG_COUNTER,
370+
SAI_DEBUG_COUNTER_ATTR_TYPE,
371+
&enum_values_capability));
372+
ASSERT_EQ(enum_values_capability.count, 4);
373+
374+
const std::set<sai_debug_counter_type_t> expectedDebugCounterTypes = {
375+
SAI_DEBUG_COUNTER_TYPE_PORT_IN_DROP_REASONS,
376+
SAI_DEBUG_COUNTER_TYPE_PORT_OUT_DROP_REASONS,
377+
SAI_DEBUG_COUNTER_TYPE_SWITCH_IN_DROP_REASONS,
378+
SAI_DEBUG_COUNTER_TYPE_SWITCH_OUT_DROP_REASONS
379+
};
380+
381+
std::set<sai_debug_counter_type_t> actualDebugCounterTypes;
382+
std::transform(
383+
haList.cbegin(), haList.cend(),
384+
std::inserter(actualDebugCounterTypes, actualDebugCounterTypes.begin()),
385+
[](sai_int32_t value) { return static_cast<sai_debug_counter_type_t>(value); }
386+
);
387+
ASSERT_EQ(expectedDebugCounterTypes, actualDebugCounterTypes);
388+
}

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)