Skip to content

Commit 4e9bc50

Browse files
authored
[trim]: Add Packet Trimming Drop Counters to VS lib (#77)
Signed-off-by: Nazarii Hnydyn <nazariig@nvidia.com> **DEPENDS:** 1. sonic-net/sonic-swss-common#1055 **HLD:** sonic-net/SONiC#2033 Requires SAI API v1.16.2 #### A picture of a cute animal (not mandatory but encouraged) ``` .---. .----------- / \ __ / ------ / / \( )/ ----- ////// ' \/ ` --- //// / // : : --- // / / /` '-- // //..\\ ====UU====UU==== '//||\\` ''`` ```
1 parent 3b443cc commit 4e9bc50

5 files changed

Lines changed: 188 additions & 6 deletions

File tree

syncd/FlexCounter.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ static const std::string COUNTER_TYPE_ENI = "DASH ENI Counter";
3131
static const std::string COUNTER_TYPE_METER_BUCKET = "DASH Meter Bucket Counter";
3232
static const std::string COUNTER_TYPE_POLICER = "Policer Counter";
3333
static const std::string COUNTER_TYPE_SRV6 = "SRv6 Counter";
34+
static const std::string COUNTER_TYPE_SWITCH = "Switch Counter";
3435
static const std::string ATTR_TYPE_QUEUE = "Queue Attribute";
3536
static const std::string ATTR_TYPE_PG = "Priority Group Attribute";
3637
static const std::string ATTR_TYPE_MACSEC_SA = "MACSEC SA Attribute";
@@ -68,6 +69,7 @@ const std::map<std::tuple<sai_object_type_t, std::string>, std::string> FlexCoun
6869
{{(sai_object_type_t)SAI_OBJECT_TYPE_ENI, ENI_COUNTER_ID_LIST}, COUNTER_TYPE_ENI},
6970
{{(sai_object_type_t)SAI_OBJECT_TYPE_ENI, DASH_METER_COUNTER_ID_LIST}, COUNTER_TYPE_METER_BUCKET},
7071
{{SAI_OBJECT_TYPE_COUNTER, SRV6_COUNTER_ID_LIST}, COUNTER_TYPE_SRV6},
72+
{{SAI_OBJECT_TYPE_SWITCH, SWITCH_COUNTER_ID_LIST}, COUNTER_TYPE_SWITCH},
7173
};
7274

7375
BaseCounterContext::BaseCounterContext(const std::string &name, const std::string &instance):
@@ -2852,6 +2854,13 @@ std::shared_ptr<BaseCounterContext> FlexCounter::createCounterContext(
28522854
{
28532855
return std::make_shared<CounterContext<sai_counter_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_COUNTER, m_vendorSai.get(), m_statsMode);
28542856
}
2857+
else if (context_name == COUNTER_TYPE_SWITCH)
2858+
{
2859+
auto context = std::make_shared<CounterContext<sai_switch_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_SWITCH, m_vendorSai.get(), m_statsMode);
2860+
context->always_check_supported_counters = true;
2861+
context->use_sai_stats_capa_query = true;
2862+
return context;
2863+
}
28552864

28562865
SWSS_LOG_THROW("Invalid counter type %s", context_name.c_str());
28572866
// GCC 8.3 requires a return value here
@@ -3093,6 +3102,10 @@ void FlexCounter::removeCounter(
30933102
{
30943103
getCounterContext(COUNTER_TYPE_SWITCH_DEBUG)->removeObject(vid);
30953104
}
3105+
if (hasCounterContext(COUNTER_TYPE_SWITCH))
3106+
{
3107+
getCounterContext(COUNTER_TYPE_SWITCH)->removeObject(vid);
3108+
}
30963109
}
30973110
else if (objectType == SAI_OBJECT_TYPE_MACSEC_FLOW)
30983111
{

unittest/syncd/TestFlexCounter.cpp

Lines changed: 94 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,68 @@ TEST(FlexCounter, addRemoveCounter)
628628
false,
629629
STATS_MODE_READ,
630630
true);
631+
632+
// Packet Trimming
633+
634+
testAddRemoveCounter(
635+
1,
636+
SAI_OBJECT_TYPE_PORT,
637+
PORT_COUNTER_ID_LIST,
638+
{"SAI_PORT_STAT_TRIM_PACKETS", "SAI_PORT_STAT_DROPPED_TRIM_PACKETS", "SAI_PORT_STAT_TX_TRIM_PACKETS"},
639+
{"100", "200", "300"},
640+
counterVerifyFunc,
641+
false);
642+
643+
testAddRemoveCounter(
644+
1,
645+
SAI_OBJECT_TYPE_PORT,
646+
PORT_COUNTER_ID_LIST,
647+
{"SAI_PORT_STAT_TRIM_PACKETS", "SAI_PORT_STAT_DROPPED_TRIM_PACKETS", "SAI_PORT_STAT_TX_TRIM_PACKETS"},
648+
{"100", "200", "300"},
649+
counterVerifyFunc,
650+
false,
651+
STATS_MODE_READ,
652+
true);
653+
654+
testAddRemoveCounter(
655+
1,
656+
SAI_OBJECT_TYPE_QUEUE,
657+
QUEUE_COUNTER_ID_LIST,
658+
{"SAI_QUEUE_STAT_TRIM_PACKETS", "SAI_QUEUE_STAT_DROPPED_TRIM_PACKETS", "SAI_QUEUE_STAT_TX_TRIM_PACKETS"},
659+
{"100", "200", "300"},
660+
counterVerifyFunc,
661+
false);
662+
663+
testAddRemoveCounter(
664+
1,
665+
SAI_OBJECT_TYPE_QUEUE,
666+
QUEUE_COUNTER_ID_LIST,
667+
{"SAI_QUEUE_STAT_TRIM_PACKETS", "SAI_QUEUE_STAT_DROPPED_TRIM_PACKETS", "SAI_QUEUE_STAT_TX_TRIM_PACKETS"},
668+
{"100", "200", "300"},
669+
counterVerifyFunc,
670+
false,
671+
STATS_MODE_READ,
672+
true);
673+
674+
testAddRemoveCounter(
675+
1,
676+
SAI_OBJECT_TYPE_SWITCH,
677+
SWITCH_COUNTER_ID_LIST,
678+
{"SAI_SWITCH_STAT_DROPPED_TRIM_PACKETS", "SAI_SWITCH_STAT_TX_TRIM_PACKETS"},
679+
{"100", "200"},
680+
counterVerifyFunc,
681+
false);
682+
683+
testAddRemoveCounter(
684+
1,
685+
SAI_OBJECT_TYPE_SWITCH,
686+
SWITCH_COUNTER_ID_LIST,
687+
{"SAI_SWITCH_STAT_DROPPED_TRIM_PACKETS", "SAI_SWITCH_STAT_TX_TRIM_PACKETS"},
688+
{"100", "200"},
689+
counterVerifyFunc,
690+
false,
691+
STATS_MODE_READ,
692+
true);
631693
}
632694

633695
TEST(FlexCounter, UpdateExistingCounterAddBulk)
@@ -906,15 +968,15 @@ TEST(FlexCounter, bulkCounter)
906968
int counterOffset = 0;
907969
int capabilities = 0;
908970
sai->mock_queryStatsCapability = [&](sai_object_id_t switch_id, sai_object_type_t object_type, sai_stat_capability_list_t *stats_capability) {
909-
// Assume all counters are in range [currentOffset, currentOffset + 100]
971+
// Assume all counters are in range [currentOffset, currentOffset + 250]
910972
if (stats_capability->count == 0)
911973
{
912-
stats_capability->count = 100;
974+
stats_capability->count = 250;
913975
return SAI_STATUS_BUFFER_OVERFLOW;
914976
}
915977
else
916978
{
917-
for (int i = 0; i < 100; i++)
979+
for (int i = 0; i < 250; i++)
918980
{
919981
stats_capability->list[i].stat_enum = i + counterOffset;
920982
if (capabilities == 0)
@@ -1106,6 +1168,35 @@ TEST(FlexCounter, bulkCounter)
11061168
{"100", "200"},
11071169
counterVerifyFunc,
11081170
false);
1171+
1172+
// Packet Trimming
1173+
1174+
testAddRemoveCounter(
1175+
2,
1176+
SAI_OBJECT_TYPE_PORT,
1177+
PORT_COUNTER_ID_LIST,
1178+
{"SAI_PORT_STAT_TRIM_PACKETS", "SAI_PORT_STAT_DROPPED_TRIM_PACKETS", "SAI_PORT_STAT_TX_TRIM_PACKETS"},
1179+
{"100", "200", "300"},
1180+
counterVerifyFunc,
1181+
false);
1182+
1183+
testAddRemoveCounter(
1184+
2,
1185+
SAI_OBJECT_TYPE_QUEUE,
1186+
QUEUE_COUNTER_ID_LIST,
1187+
{"SAI_QUEUE_STAT_TRIM_PACKETS", "SAI_QUEUE_STAT_DROPPED_TRIM_PACKETS", "SAI_QUEUE_STAT_TX_TRIM_PACKETS"},
1188+
{"100", "200", "300"},
1189+
counterVerifyFunc,
1190+
false);
1191+
1192+
testAddRemoveCounter(
1193+
2,
1194+
SAI_OBJECT_TYPE_SWITCH,
1195+
SWITCH_COUNTER_ID_LIST,
1196+
{"SAI_SWITCH_STAT_DROPPED_TRIM_PACKETS", "SAI_SWITCH_STAT_TX_TRIM_PACKETS"},
1197+
{"100", "200"},
1198+
counterVerifyFunc,
1199+
false);
11091200
}
11101201

11111202
TEST(FlexCounter, bulkChunksize)

unittest/vslib/TestVirtualSwitchSaiInterface.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,25 @@ TEST_F(VirtualSwitchSaiInterfaceTest, queryStatsCapability)
164164
std::vector<sai_stat_capability_t> capability_list;
165165
sai_stat_capability_list_t stats_capability;
166166

167+
/* Switch stats capability get */
168+
stats_capability.count = 0;
169+
stats_capability.list = nullptr;
170+
171+
EXPECT_EQ(SAI_STATUS_BUFFER_OVERFLOW,
172+
m_vssai->queryStatsCapability(
173+
m_swid,
174+
SAI_OBJECT_TYPE_SWITCH,
175+
&stats_capability));
176+
177+
capability_list.resize(stats_capability.count);
178+
stats_capability.list = capability_list.data();
179+
180+
EXPECT_EQ(SAI_STATUS_SUCCESS,
181+
m_vssai->queryStatsCapability(
182+
m_swid,
183+
SAI_OBJECT_TYPE_SWITCH,
184+
&stats_capability));
185+
167186
/* Queue stats capability get */
168187
stats_capability.count = 0;
169188
stats_capability.list = nullptr;
@@ -209,6 +228,25 @@ TEST_F(VirtualSwitchSaiInterfaceTest, queryStatsStCapability)
209228
sai_stat_st_capability_list_t stats_capability;
210229
stats_capability.list = capability_list;
211230

231+
/* Switch stats capability get */
232+
stats_capability.count = 0;
233+
stats_capability.list = nullptr;
234+
235+
EXPECT_EQ(SAI_STATUS_BUFFER_OVERFLOW,
236+
m_vssai->queryStatsStCapability(
237+
m_swid,
238+
SAI_OBJECT_TYPE_SWITCH,
239+
&stats_capability));
240+
241+
capability_list.resize(stats_capability.count);
242+
stats_capability.list = capability_list.data();
243+
244+
EXPECT_EQ(SAI_STATUS_SUCCESS,
245+
m_vssai->queryStatsStCapability(
246+
m_swid,
247+
SAI_OBJECT_TYPE_SWITCH,
248+
&stats_capability));
249+
212250
/* Queue stats capability get */
213251
stats_capability.count = 1;
214252

vslib/SwitchStateBase.cpp

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4109,6 +4109,35 @@ sai_status_t SwitchStateBase::queryAttributeCapability(
41094109
return SAI_STATUS_SUCCESS;
41104110
}
41114111

4112+
sai_status_t SwitchStateBase::querySwitchStatsCapability(
4113+
_Inout_ sai_stat_capability_list_t *stats_capability)
4114+
{
4115+
SWSS_LOG_ENTER();
4116+
4117+
static std::vector<sai_switch_stat_t> switchStatList = {
4118+
SAI_SWITCH_STAT_ECC_DROP,
4119+
SAI_SWITCH_STAT_PACKET_INTEGRITY_DROP,
4120+
SAI_SWITCH_STAT_DROPPED_TRIM_PACKETS,
4121+
SAI_SWITCH_STAT_TX_TRIM_PACKETS
4122+
};
4123+
4124+
if (stats_capability->count < switchStatList.size())
4125+
{
4126+
stats_capability->count = static_cast<uint32_t>(switchStatList.size());
4127+
return SAI_STATUS_BUFFER_OVERFLOW;
4128+
}
4129+
4130+
stats_capability->count = static_cast<uint32_t>(switchStatList.size());
4131+
4132+
for (std::uint32_t i = 0; i < switchStatList.size(); i++)
4133+
{
4134+
stats_capability->list[i].stat_modes = SAI_STATS_MODE_READ_AND_CLEAR | SAI_STATS_MODE_READ;
4135+
stats_capability->list[i].stat_enum = static_cast<sai_stat_id_t>(switchStatList.at(i));
4136+
}
4137+
4138+
return SAI_STATUS_SUCCESS;
4139+
}
4140+
41124141
sai_status_t SwitchStateBase::queryPortStatsCapability(
41134142
_Inout_ sai_stat_capability_list_t *stats_capability)
41144143
{
@@ -4206,7 +4235,9 @@ sai_status_t SwitchStateBase::queryPortStatsCapability(
42064235
SAI_PORT_STAT_PFC_5_ON2OFF_RX_PKTS,
42074236
SAI_PORT_STAT_PFC_6_ON2OFF_RX_PKTS,
42084237
SAI_PORT_STAT_PFC_7_ON2OFF_RX_PKTS,
4209-
SAI_PORT_STAT_TRIM_PACKETS
4238+
SAI_PORT_STAT_TRIM_PACKETS,
4239+
SAI_PORT_STAT_DROPPED_TRIM_PACKETS,
4240+
SAI_PORT_STAT_TX_TRIM_PACKETS
42104241
};
42114242

42124243
if (stats_capability->count < portStatList.size())
@@ -4245,7 +4276,9 @@ sai_status_t SwitchStateBase::queryQueueStatsCapability(
42454276
SAI_QUEUE_STAT_CURR_OCCUPANCY_LEVEL,
42464277
SAI_QUEUE_STAT_WATERMARK_LEVEL,
42474278
SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS,
4248-
SAI_QUEUE_STAT_TRIM_PACKETS
4279+
SAI_QUEUE_STAT_TRIM_PACKETS,
4280+
SAI_QUEUE_STAT_DROPPED_TRIM_PACKETS,
4281+
SAI_QUEUE_STAT_TX_TRIM_PACKETS
42494282
};
42504283

42514284
if (stats_capability->count < queueStatList.size())
@@ -4272,7 +4305,11 @@ sai_status_t SwitchStateBase::queryStatsCapability(
42724305
{
42734306
SWSS_LOG_ENTER();
42744307

4275-
if (objectType == SAI_OBJECT_TYPE_QUEUE)
4308+
if (objectType == SAI_OBJECT_TYPE_SWITCH)
4309+
{
4310+
return querySwitchStatsCapability(stats_capability);
4311+
}
4312+
else if (objectType == SAI_OBJECT_TYPE_QUEUE)
42764313
{
42774314
return queryQueueStatsCapability(stats_capability);
42784315
}

vslib/SwitchStateBase.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,9 @@ namespace saivs
767767

768768
protected:
769769

770+
virtual sai_status_t querySwitchStatsCapability(
771+
_Inout_ sai_stat_capability_list_t *stats_capability);
772+
770773
virtual sai_status_t queryPortStatsCapability(
771774
_Inout_ sai_stat_capability_list_t *stats_capability);
772775

0 commit comments

Comments
 (0)