1+ #include < cstdlib>
2+ #include < cstring>
3+ #include < algorithm>
4+
15#include " portsorch.h"
26#include " intfsorch.h"
37#include " bufferorch.h"
@@ -302,7 +306,9 @@ const vector<sai_port_stat_t> port_stat_ids =
302306 SAI_PORT_STAT_IF_IN_FEC_CODEWORD_ERRORS_S14,
303307 SAI_PORT_STAT_IF_IN_FEC_CODEWORD_ERRORS_S15,
304308 SAI_PORT_STAT_IF_IN_FEC_CORRECTED_BITS,
305- SAI_PORT_STAT_TRIM_PACKETS
309+ SAI_PORT_STAT_TRIM_PACKETS,
310+ SAI_PORT_STAT_DROPPED_TRIM_PACKETS,
311+ SAI_PORT_STAT_TX_TRIM_PACKETS
306312};
307313
308314const vector<sai_port_stat_t > gbport_stat_ids =
@@ -339,7 +345,9 @@ static const vector<sai_queue_stat_t> queue_stat_ids =
339345 SAI_QUEUE_STAT_BYTES,
340346 SAI_QUEUE_STAT_DROPPED_PACKETS,
341347 SAI_QUEUE_STAT_DROPPED_BYTES,
342- SAI_QUEUE_STAT_TRIM_PACKETS
348+ SAI_QUEUE_STAT_TRIM_PACKETS,
349+ SAI_QUEUE_STAT_DROPPED_TRIM_PACKETS,
350+ SAI_QUEUE_STAT_TX_TRIM_PACKETS
343351};
344352static const vector<sai_queue_stat_t > voq_stat_ids =
345353{
@@ -585,6 +593,56 @@ bool PortsOrch::checkPathTracingCapability()
585593 return m_isPathTracingSupported;
586594}
587595
596+ static bool isPortStatSupported (sai_port_stat_t stat)
597+ {
598+ static std::vector<sai_stat_capability_t > statList;
599+
600+ if (statList.empty ())
601+ {
602+ sai_stat_capability_list_t capList = { .count = 0 , .list = nullptr };
603+
604+ auto status = sai_query_stats_capability (gSwitchId , SAI_OBJECT_TYPE_PORT, &capList);
605+ if ((status != SAI_STATUS_SUCCESS) && (status != SAI_STATUS_BUFFER_OVERFLOW))
606+ {
607+ return false ;
608+ }
609+
610+ statList.resize (capList.count );
611+ capList.list = statList.data ();
612+
613+ status = sai_query_stats_capability (gSwitchId , SAI_OBJECT_TYPE_PORT, &capList);
614+ if (status != SAI_STATUS_SUCCESS)
615+ {
616+ return false ;
617+ }
618+ }
619+
620+ return std::any_of (
621+ statList.cbegin (),
622+ statList.cend (),
623+ [stat](const sai_stat_capability_t &cap) {
624+ return static_cast <sai_port_stat_t >(cap.stat_enum ) == stat;
625+ }
626+ );
627+ }
628+
629+ static bool isMlnxPlatform ()
630+ {
631+ const auto *platform = std::getenv (" platform" );
632+ if (platform == nullptr )
633+ {
634+ return false ;
635+ }
636+
637+ const auto *result = std::strstr (platform, MLNX_PLATFORM_SUBSTRING);
638+ if (result == nullptr )
639+ {
640+ return false ;
641+ }
642+
643+ return true ;
644+ }
645+
588646// Port OA ------------------------------------------------------------------------------------------------------------
589647
590648/*
@@ -671,10 +729,11 @@ PortsOrch::PortsOrch(DBConnector *db, DBConnector *stateDb, vector<table_name_wi
671729
672730 initGearbox ();
673731
674- string queueWmSha, pgWmSha, portRateSha;
732+ string queueWmSha, pgWmSha, portRateSha, nvdaPortTrimSha ;
675733 string queueWmPluginName = " watermark_queue.lua" ;
676734 string pgWmPluginName = " watermark_pg.lua" ;
677735 string portRatePluginName = " port_rates.lua" ;
736+ string nvdaPortTrimPluginName = " nvda_port_trim_drop.lua" ;
678737
679738 try
680739 {
@@ -686,12 +745,26 @@ PortsOrch::PortsOrch(DBConnector *db, DBConnector *stateDb, vector<table_name_wi
686745
687746 string portRateLuaScript = swss::loadLuaScript (portRatePluginName);
688747 portRateSha = swss::loadRedisScript (m_counter_db.get (), portRateLuaScript);
748+
749+ string nvdaPortTrimLuaScript = swss::loadLuaScript (nvdaPortTrimPluginName);
750+ nvdaPortTrimSha = swss::loadRedisScript (m_counter_db.get (), nvdaPortTrimLuaScript);
689751 }
690752 catch (const runtime_error &e)
691753 {
692754 SWSS_LOG_ERROR (" Port flex counter groups were not set successfully: %s" , e.what ());
693755 }
694756
757+ std::string portStatPlugins = portRateSha;
758+
759+ // Nvidia custom trim stat calculation
760+ if (isMlnxPlatform () && \
761+ isPortStatSupported (SAI_PORT_STAT_TRIM_PACKETS) && \
762+ isPortStatSupported (SAI_PORT_STAT_TX_TRIM_PACKETS) && \
763+ !isPortStatSupported (SAI_PORT_STAT_DROPPED_TRIM_PACKETS))
764+ {
765+ portStatPlugins += " ," + nvdaPortTrimSha;
766+ }
767+
695768 setFlexCounterGroupParameter (QUEUE_WATERMARK_STAT_COUNTER_FLEX_COUNTER_GROUP,
696769 QUEUE_WATERMARK_FLEX_STAT_COUNTER_POLL_MSECS,
697770 STATS_MODE_READ_AND_CLEAR,
@@ -708,7 +781,7 @@ PortsOrch::PortsOrch(DBConnector *db, DBConnector *stateDb, vector<table_name_wi
708781 PORT_RATE_FLEX_COUNTER_POLLING_INTERVAL_MS,
709782 STATS_MODE_READ,
710783 PORT_PLUGIN_FIELD,
711- portRateSha );
784+ portStatPlugins );
712785
713786 setFlexCounterGroupParameter (PG_DROP_STAT_COUNTER_FLEX_COUNTER_GROUP,
714787 PG_DROP_FLEX_STAT_COUNTER_POLL_MSECS,
0 commit comments