From 7256e57df66f76e965244b1988317a1aa7d74912 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 24 Mar 2025 18:38:49 +0200 Subject: [PATCH] Packet trimming: Add DSCP resolution from TC and documentation Signed-off-by: Marian Pritsak --- doc/SAI-Proposal-Packet-Trimming.md | 48 ++++++++++++++++++++++++++++ doc/figures/trim-TC.png | Bin 0 -> 41001 bytes inc/saiswitch.h | 39 ++++++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 doc/figures/trim-TC.png diff --git a/doc/SAI-Proposal-Packet-Trimming.md b/doc/SAI-Proposal-Packet-Trimming.md index 9f33777c0..b160661f5 100644 --- a/doc/SAI-Proposal-Packet-Trimming.md +++ b/doc/SAI-Proposal-Packet-Trimming.md @@ -164,3 +164,51 @@ Both the queue and the port have the packet counter to reflect the number of tri /** Packets trimmed due to failed admission [uint64_t] */ SAI_QUEUE_STAT_TRIM_PACKETS = 0x00000028, ``` + +It can also be beneficial to support multiple DSCP values for trimmed packets sent out via different ports. For example, trimmed packets sent to hosts will get DSCP 5 whereas trimmed packets sent to uplink/spine will have DSCP 7. It is to allow to the destination NIC to know where congestion happened - on downlinks to servers or in the fabric. Such information can be used for a better decision making on how to react to the state of network. + +![](figures/trim-TC.png) + +The diagram above shows the general concept - instead of setting a trim DSCP, we set a trim TC value, which, by applying a different TC to DSCP map per egres port, will yield a different DSCP value. + +``` +typedef enum _sai_packet_trim_dscp_resolution_mode_t +{ + /** + * @brief Static DSCP resolution. + * + * In this mode, a new DSCP for the trimmed packet is set directly + * by the application. + */ + SAI_PACKET_TRIM_DSCP_RESOLUTION_MODE_DSCP_VALUE, + + /** + * @brief Dynamic DSCP resolution. + * + * In this mode, a new DSCP for the trimmed packet is resolved from the new TRIM_TC + * set by the application using per-port TC_TO_DSCP mapping + */ + SAI_PACKET_TRIM_DSCP_RESOLUTION_MODE_FROM_TC +} sai_packet_trim_dscp_resolution_mode_t; +``` + +``` + /** + * @brief New packet trim TC value + * + * @type sai_uint8_t + * @flags CREATE_AND_SET + * @default 0 + * @validonly SAI_SWITCH_ATTR_PACKET_TRIM_DSCP_RESOLUTION_MODE == SAI_PACKET_TRIM_DSCP_RESOLUTION_MODE_FROM_TC + */ + SAI_SWITCH_ATTR_PACKET_TRIM_TC_VALUE, + + /** + * @brief DSCP mapping mode for a trimmed packet + * + * @type sai_packet_trim_dscp_resolution_mode_t + * @flags CREATE_AND_SET + * @default SAI_PACKET_TRIM_DSCP_RESOLUTION_MODE_DSCP_VALUE + */ + SAI_SWITCH_ATTR_PACKET_TRIM_DSCP_RESOLUTION_MODE, +``` diff --git a/doc/figures/trim-TC.png b/doc/figures/trim-TC.png new file mode 100644 index 0000000000000000000000000000000000000000..d7816acd09205f2d5ba0f860c5cdc85aaca2272f GIT binary patch literal 41001 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 QH99wo1J