diff --git a/orchagent/switch/trimming/capabilities.cpp b/orchagent/switch/trimming/capabilities.cpp index c4c8efc70e9..4c4bc270cc4 100644 --- a/orchagent/switch/trimming/capabilities.cpp +++ b/orchagent/switch/trimming/capabilities.cpp @@ -109,7 +109,27 @@ bool SwitchTrimmingCapabilities::isSwitchTrimmingSupported() const queue = capabilities.queue.isAttrSupported; } - return size && dscp && mode && queue; + return size || dscp || mode || queue; +} + +bool SwitchTrimmingCapabilities::isSwitchTrimmingSizeSetSupported() const +{ + return capabilities.size.isAttrSupported; +} + +bool SwitchTrimmingCapabilities::isSwitchTrimmingDscpSetSupported() const +{ + return capabilities.dscp.isAttrSupported; +} + +bool SwitchTrimmingCapabilities::isSwitchTrimmingQueueSetSupported() const +{ + return capabilities.mode.isStaticModeSupported && capabilities.queue.isAttrSupported; +} + +bool SwitchTrimmingCapabilities::isSwitchTrimmingModeSetSupported() const +{ + return capabilities.mode.isAttrSupported; } bool SwitchTrimmingCapabilities::validateQueueModeCap(sai_packet_trim_queue_resolution_mode_t value) const diff --git a/orchagent/switch/trimming/capabilities.h b/orchagent/switch/trimming/capabilities.h index 52ced127786..3f2ff00e2df 100644 --- a/orchagent/switch/trimming/capabilities.h +++ b/orchagent/switch/trimming/capabilities.h @@ -16,7 +16,11 @@ class SwitchTrimmingCapabilities final ~SwitchTrimmingCapabilities() = default; bool isSwitchTrimmingSupported() const; - + bool isSwitchTrimmingSizeSetSupported() const; + bool isSwitchTrimmingDscpSetSupported() const; + bool isSwitchTrimmingModeSetSupported() const; + bool isSwitchTrimmingQueueSetSupported() const; + bool validateQueueModeCap(sai_packet_trim_queue_resolution_mode_t value) const; private: diff --git a/orchagent/switchorch.cpp b/orchagent/switchorch.cpp index 6f5be293dee..75bcf3a130f 100644 --- a/orchagent/switchorch.cpp +++ b/orchagent/switchorch.cpp @@ -959,94 +959,106 @@ bool SwitchOrch::setSwitchTrimming(const SwitchTrimming &trim) return true; } - if (trim.size.is_set) + if (trimCap.isSwitchTrimmingSizeSetSupported()) { - if (!tObj.size.is_set || (tObj.size.value != trim.size.value)) + if (trim.size.is_set) { - if (!setSwitchTrimmingSizeSai(trim)) + if (!tObj.size.is_set || (tObj.size.value != trim.size.value)) { - SWSS_LOG_ERROR("Failed to set switch trimming size in SAI"); - return false; - } + if (!setSwitchTrimmingSizeSai(trim)) + { + SWSS_LOG_ERROR("Failed to set switch trimming size in SAI"); + return false; + } - cfgUpd = true; + cfgUpd = true; + } } - } - else - { - if (tObj.size.is_set) + else { - SWSS_LOG_ERROR("Failed to remove switch trimming size configuration: operation is not supported"); - return false; + if (tObj.size.is_set) + { + SWSS_LOG_ERROR("Failed to remove switch trimming size configuration: operation is not supported"); + return false; + } } } - if (trim.dscp.is_set) + if (trimCap.isSwitchTrimmingDscpSetSupported()) { - if (!tObj.dscp.is_set || (tObj.dscp.value != trim.dscp.value)) + if (trim.dscp.is_set) { - if (!setSwitchTrimmingDscpSai(trim)) + if (!tObj.dscp.is_set || (tObj.dscp.value != trim.dscp.value)) { - SWSS_LOG_ERROR("Failed to set switch trimming DSCP in SAI"); - return false; - } + if (!setSwitchTrimmingDscpSai(trim)) + { + SWSS_LOG_ERROR("Failed to set switch trimming DSCP in SAI"); + return false; + } - cfgUpd = true; + cfgUpd = true; + } } - } - else - { - if (tObj.dscp.is_set) + else { - SWSS_LOG_ERROR("Failed to remove switch trimming DSCP configuration: operation is not supported"); - return false; + if (tObj.dscp.is_set) + { + SWSS_LOG_ERROR("Failed to remove switch trimming DSCP configuration: operation is not supported"); + return false; + } } } - if (trim.queue.mode.is_set) + if (trimCap.isSwitchTrimmingModeSetSupported()) { - if (!tObj.queue.mode.is_set || (tObj.queue.mode.value != trim.queue.mode.value)) + if (trim.queue.mode.is_set) { - if (!trimCap.validateQueueModeCap(trim.queue.mode.value)) + if (!tObj.queue.mode.is_set || (tObj.queue.mode.value != trim.queue.mode.value)) { - SWSS_LOG_ERROR("Failed to validate switch trimming queue mode: capability is not supported"); - return false; - } + if (!trimCap.validateQueueModeCap(trim.queue.mode.value)) + { + SWSS_LOG_ERROR("Failed to validate switch trimming queue mode: capability is not supported"); + return false; + } - if (!setSwitchTrimmingQueueModeSai(trim)) - { - SWSS_LOG_ERROR("Failed to set switch trimming queue mode in SAI"); - return false; - } + if (!setSwitchTrimmingQueueModeSai(trim)) + { + SWSS_LOG_ERROR("Failed to set switch trimming queue mode in SAI"); + return false; + } - if (trimHlpr.isStaticQueueMode(tObj)) - { - qIdxBak = true; - } + if (trimHlpr.isStaticQueueMode(tObj)) + { + qIdxBak = true; + } - cfgUpd = true; + cfgUpd = true; + } } - } - else - { - if (tObj.queue.mode.is_set) + else { - SWSS_LOG_ERROR("Failed to remove switch trimming queue configuration: operation is not supported"); - return false; + if (tObj.queue.mode.is_set) + { + SWSS_LOG_ERROR("Failed to remove switch trimming queue configuration: operation is not supported"); + return false; + } } } - if (trim.queue.index.is_set) + if (trimCap.isSwitchTrimmingQueueSetSupported()) { - if (!tObj.queue.index.is_set || (tObj.queue.index.value != trim.queue.index.value)) + if (trim.queue.index.is_set) { - if (!setSwitchTrimmingQueueIndexSai(trim)) + if (!tObj.queue.index.is_set || (tObj.queue.index.value != trim.queue.index.value)) { - SWSS_LOG_ERROR("Failed to set switch trimming queue index in SAI"); - return false; - } + if (!setSwitchTrimmingQueueIndexSai(trim)) + { + SWSS_LOG_ERROR("Failed to set switch trimming queue index in SAI"); + return false; + } - cfgUpd = true; + cfgUpd = true; + } } }