1+ #include < cstdlib>
2+ #include < cstring>
3+ #include < algorithm>
4+
15#include " portsorch.h"
26#include " intfsorch.h"
37#include " bufferorch.h"
@@ -257,7 +261,9 @@ const vector<sai_port_stat_t> port_stat_ids =
257261 SAI_PORT_STAT_IF_IN_FEC_CODEWORD_ERRORS_S14,
258262 SAI_PORT_STAT_IF_IN_FEC_CODEWORD_ERRORS_S15,
259263 SAI_PORT_STAT_IF_IN_FEC_CORRECTED_BITS,
260- SAI_PORT_STAT_TRIM_PACKETS
264+ SAI_PORT_STAT_TRIM_PACKETS,
265+ SAI_PORT_STAT_DROPPED_TRIM_PACKETS,
266+ SAI_PORT_STAT_TX_TRIM_PACKETS
261267};
262268
263269const vector<sai_port_stat_t > gbport_stat_ids =
@@ -294,7 +300,9 @@ static const vector<sai_queue_stat_t> queue_stat_ids =
294300 SAI_QUEUE_STAT_BYTES,
295301 SAI_QUEUE_STAT_DROPPED_PACKETS,
296302 SAI_QUEUE_STAT_DROPPED_BYTES,
297- SAI_QUEUE_STAT_TRIM_PACKETS
303+ SAI_QUEUE_STAT_TRIM_PACKETS,
304+ SAI_QUEUE_STAT_DROPPED_TRIM_PACKETS,
305+ SAI_QUEUE_STAT_TX_TRIM_PACKETS
298306};
299307static const vector<sai_queue_stat_t > voq_stat_ids =
300308{
@@ -540,6 +548,56 @@ bool PortsOrch::checkPathTracingCapability()
540548 return m_isPathTracingSupported;
541549}
542550
551+ static bool isPortStatSupported (sai_port_stat_t stat)
552+ {
553+ static std::vector<sai_stat_capability_t > statList;
554+
555+ if (statList.empty ())
556+ {
557+ sai_stat_capability_list_t capList = { .count = 0 , .list = nullptr };
558+
559+ auto status = sai_query_stats_capability (gSwitchId , SAI_OBJECT_TYPE_PORT, &capList);
560+ if ((status != SAI_STATUS_SUCCESS) && (status != SAI_STATUS_BUFFER_OVERFLOW))
561+ {
562+ return false ;
563+ }
564+
565+ statList.resize (capList.count );
566+ capList.list = statList.data ();
567+
568+ status = sai_query_stats_capability (gSwitchId , SAI_OBJECT_TYPE_PORT, &capList);
569+ if (status != SAI_STATUS_SUCCESS)
570+ {
571+ return false ;
572+ }
573+ }
574+
575+ return std::any_of (
576+ statList.cbegin (),
577+ statList.cend (),
578+ [stat](const sai_stat_capability_t &cap) {
579+ return static_cast <sai_port_stat_t >(cap.stat_enum ) == stat;
580+ }
581+ );
582+ }
583+
584+ static bool isMlnxPlatform ()
585+ {
586+ const auto *platform = std::getenv (" platform" );
587+ if (platform == nullptr )
588+ {
589+ return false ;
590+ }
591+
592+ const auto *result = std::strstr (platform, MLNX_PLATFORM_SUBSTRING);
593+ if (result == nullptr )
594+ {
595+ return false ;
596+ }
597+
598+ return true ;
599+ }
600+
543601// Port OA ------------------------------------------------------------------------------------------------------------
544602
545603/*
@@ -627,10 +685,11 @@ PortsOrch::PortsOrch(DBConnector *db, DBConnector *stateDb, vector<table_name_wi
627685
628686 initGearbox ();
629687
630- string queueWmSha, pgWmSha, portRateSha;
688+ string queueWmSha, pgWmSha, portRateSha, nvdaPortTrimSha ;
631689 string queueWmPluginName = " watermark_queue.lua" ;
632690 string pgWmPluginName = " watermark_pg.lua" ;
633691 string portRatePluginName = " port_rates.lua" ;
692+ string nvdaPortTrimPluginName = " nvda_port_trim_drop.lua" ;
634693
635694 try
636695 {
@@ -642,12 +701,26 @@ PortsOrch::PortsOrch(DBConnector *db, DBConnector *stateDb, vector<table_name_wi
642701
643702 string portRateLuaScript = swss::loadLuaScript (portRatePluginName);
644703 portRateSha = swss::loadRedisScript (m_counter_db.get (), portRateLuaScript);
704+
705+ string nvdaPortTrimLuaScript = swss::loadLuaScript (nvdaPortTrimPluginName);
706+ nvdaPortTrimSha = swss::loadRedisScript (m_counter_db.get (), nvdaPortTrimLuaScript);
645707 }
646708 catch (const runtime_error &e)
647709 {
648710 SWSS_LOG_ERROR (" Port flex counter groups were not set successfully: %s" , e.what ());
649711 }
650712
713+ std::string portStatPlugins = portRateSha;
714+
715+ // Nvidia custom trim stat calculation
716+ if (isMlnxPlatform () && \
717+ isPortStatSupported (SAI_PORT_STAT_TRIM_PACKETS) && \
718+ isPortStatSupported (SAI_PORT_STAT_TX_TRIM_PACKETS) && \
719+ !isPortStatSupported (SAI_PORT_STAT_DROPPED_TRIM_PACKETS))
720+ {
721+ portStatPlugins += " ," + nvdaPortTrimSha;
722+ }
723+
651724 setFlexCounterGroupParameter (QUEUE_WATERMARK_STAT_COUNTER_FLEX_COUNTER_GROUP,
652725 QUEUE_WATERMARK_FLEX_STAT_COUNTER_POLL_MSECS,
653726 STATS_MODE_READ_AND_CLEAR,
@@ -664,7 +737,7 @@ PortsOrch::PortsOrch(DBConnector *db, DBConnector *stateDb, vector<table_name_wi
664737 PORT_RATE_FLEX_COUNTER_POLLING_INTERVAL_MS,
665738 STATS_MODE_READ,
666739 PORT_PLUGIN_FIELD,
667- portRateSha );
740+ portStatPlugins );
668741
669742 setFlexCounterGroupParameter (PG_DROP_STAT_COUNTER_FLEX_COUNTER_GROUP,
670743 PG_DROP_FLEX_STAT_COUNTER_POLL_MSECS,
0 commit comments