Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion orchagent/switch/trimming/capabilities.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 5 additions & 1 deletion orchagent/switch/trimming/capabilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
122 changes: 67 additions & 55 deletions orchagent/switchorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
}

Expand Down
Loading