From a4c80c3d8713d32b73d9428683b8670b46d65fcd Mon Sep 17 00:00:00 2001 From: Alpesh Patel Date: Thu, 16 Dec 2021 20:08:51 -0500 Subject: [PATCH] patch for issue #1971 - enable Rx Drop handling for cisco-8000 (#2041) What I did Enables support for Rx traffic drop for a port/tc by applying the zero buffer profile Changed class hierarchy so that default getHwCounters() function is used (since the Rx counter support is enabled) Fixes a pfc-wd off by 1 detection in case of PFC-WD detection without traffic Why I did it enabling a missing functionality leveraging sonic code as our sdk now implements the missing counter fixes a bug How I verified it on a cisco-8000 router: detected pfc-wd detection and restore happens within the (detection/restore-time + 1 poll interval) duration and that the changeset passes MSFT tests Verified that when PFC-WD is detected, both Rx and Tx traffic for a port/tc is dropped and no forwarding happens Details if related this patch will need to be double committed to the 202012 branch along with #1942 , #1748 and #1962 Signed-off-by: Alpesh S Patel --- orchagent/pfc_restore_cisco-8000.lua | 2 +- orchagent/pfcactionhandler.cpp | 51 ++++++++++------------------ orchagent/pfcactionhandler.h | 3 +- 3 files changed, 19 insertions(+), 37 deletions(-) diff --git a/orchagent/pfc_restore_cisco-8000.lua b/orchagent/pfc_restore_cisco-8000.lua index 686de0464be6..172e67b96094 100644 --- a/orchagent/pfc_restore_cisco-8000.lua +++ b/orchagent/pfc_restore_cisco-8000.lua @@ -44,7 +44,7 @@ for i = n, 1, -1 do and (debug_storm ~= "enabled") -- DEBUG CODE END. then - if time_left <= 0 then + if time_left <= poll_time then redis.call('PUBLISH', 'PFC_WD_ACTION', '["' .. KEYS[i] .. '","restore"]') time_left = restoration_time else diff --git a/orchagent/pfcactionhandler.cpp b/orchagent/pfcactionhandler.cpp index e44521f849f9..05f2d6ef5600 100644 --- a/orchagent/pfcactionhandler.cpp +++ b/orchagent/pfcactionhandler.cpp @@ -221,7 +221,7 @@ void PfcWdActionHandler::updateWdCounters(const string& queueIdStr, const PfcWdQ PfcWdSaiDlrInitHandler::PfcWdSaiDlrInitHandler(sai_object_id_t port, sai_object_id_t queue, uint8_t queueId, shared_ptr countersTable): - PfcWdActionHandler(port, queue, queueId, countersTable) + PfcWdZeroBufferHandler(port, queue, queueId, countersTable) { SWSS_LOG_ENTER(); @@ -262,39 +262,6 @@ PfcWdSaiDlrInitHandler::~PfcWdSaiDlrInitHandler(void) } } -bool PfcWdSaiDlrInitHandler::getHwCounters(PfcWdHwStats& counters) -{ - SWSS_LOG_ENTER(); - - static const vector queueStatIds = - { - SAI_QUEUE_STAT_PACKETS, - SAI_QUEUE_STAT_DROPPED_PACKETS, - }; - - vector queueStats; - queueStats.resize(queueStatIds.size()); - - sai_status_t status = sai_queue_api->get_queue_stats( - getQueue(), - static_cast(queueStatIds.size()), - queueStatIds.data(), - queueStats.data()); - - if (status != SAI_STATUS_SUCCESS) - { - SWSS_LOG_ERROR("Failed to fetch queue 0x%" PRIx64 " stats: %d", getQueue(), status); - return false; - } - - counters.txPkt = queueStats[0]; - counters.txDropPkt = queueStats[1]; - counters.rxPkt = 0; - counters.rxDropPkt = 0; - - return true; -} - PfcWdAclHandler::PfcWdAclHandler(sai_object_id_t port, sai_object_id_t queue, uint8_t queueId, shared_ptr
countersTable): PfcWdLossyHandler(port, queue, queueId, countersTable) @@ -472,6 +439,14 @@ PfcWdLossyHandler::PfcWdLossyHandler(sai_object_id_t port, sai_object_id_t queue { SWSS_LOG_ENTER(); + string platform = getenv("platform") ? getenv("platform") : ""; + if (platform == CISCO_8000_PLATFORM_SUBSTRING) + { + SWSS_LOG_DEBUG("Skipping in constructor PfcWdLossyHandler for platform %s on port 0x%" PRIx64, + platform.c_str(), port); + return; + } + uint8_t pfcMask = 0; if (!gPortsOrch->getPortPfc(port, &pfcMask)) @@ -491,6 +466,14 @@ PfcWdLossyHandler::~PfcWdLossyHandler(void) { SWSS_LOG_ENTER(); + string platform = getenv("platform") ? getenv("platform") : ""; + if (platform == CISCO_8000_PLATFORM_SUBSTRING) + { + SWSS_LOG_DEBUG("Skipping in destructor PfcWdLossyHandler for platform %s on port 0x%" PRIx64, + platform.c_str(), getPort()); + return; + } + uint8_t pfcMask = 0; if (!gPortsOrch->getPortPfc(getPort(), &pfcMask)) diff --git a/orchagent/pfcactionhandler.h b/orchagent/pfcactionhandler.h index 23cabaee1010..a55ac3b4a435 100644 --- a/orchagent/pfcactionhandler.h +++ b/orchagent/pfcactionhandler.h @@ -165,13 +165,12 @@ class PfcWdZeroBufferHandler: public PfcWdLossyHandler // PFC queue that implements drop action by draining queue via SAI // attribute SAI_QUEUE_ATTR_PFC_DLR_INIT. -class PfcWdSaiDlrInitHandler: public PfcWdActionHandler +class PfcWdSaiDlrInitHandler: public PfcWdZeroBufferHandler { public: PfcWdSaiDlrInitHandler(sai_object_id_t port, sai_object_id_t queue, uint8_t queueId, shared_ptr
countersTable); virtual ~PfcWdSaiDlrInitHandler(void); - virtual bool getHwCounters(PfcWdHwStats& counters); }; #endif