From ef9ded9b056cb80dff9090faae3d648d04e85b5a Mon Sep 17 00:00:00 2001 From: bingwang Date: Fri, 18 Feb 2022 09:35:35 +0000 Subject: [PATCH 01/14] TC remapping HLD Signed-off-by: bingwang --- doc/qos/tunnel_dscp_remapping.md | 180 +++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 doc/qos/tunnel_dscp_remapping.md diff --git a/doc/qos/tunnel_dscp_remapping.md b/doc/qos/tunnel_dscp_remapping.md new file mode 100644 index 0000000000..f5bcf5af18 --- /dev/null +++ b/doc/qos/tunnel_dscp_remapping.md @@ -0,0 +1,180 @@ +# TC remapping for mux tunnel + + +## 1 Table of Content ### + +### 1.1 Revision ### + +## 2 Scope ## + +This document will cover high level design of TC remapping in SONiC. + +## 3 Definitions/Abbreviations ## + +This section covers the abbreviation if any, used in this high-level design document and its definitions. + +| Term | Meaning | +|:--------:|:---------------------------------------------:| +| PFC | Priority-based Flow Control | +| TC | Traffic class| + +## 4 Overview ## + +## 5 Design ## + +### 5.1 SWSS Schema +#### 5.1.1 Define new table mapping +* Table for decap + + DSCP_TO_TC_MAP for mapping DSCP to TC + ```json + "DSCP_TO_TC_MAP": { + "AZURE_TUNNEL": { + "0": "1", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "1", + "6": "6", + "7": "1", + "8": "0", + "9": "1", + ...... + } + ``` + TC_TO_PRIORITY_GROUP_MAP for mappping TC to PG + ```json + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE_TUNNEL": { + "0": "0", + "1": "0", + "2": "0", + "3": "2", + "4": "6", + "5": "0", + "6": "0", + "7": "7" + } + ``` +* Table for encap + + TC_TO_QUEUE_MAP for remapping queue + ```json + "TC_TO_QUEUE_MAP": { + "AZURE_TUNNEL": { + "0": "0", + "1": "1", + "2": "1", + "3": "2", + "4": "6", + "5": "5", + "6": "1", + "7": "7" + } + ``` + TC_TO_DSCP_MAP for rewriting DSCP + ```json + "TC_TO_DSCP_MAP": { + "AZURE_TUNNEL": { + "0": "8", + "1": "0", + "2": "0", + "3": "2", + "4": "6", + "5": "46", + "6": "0", + "7": "48" + } + ``` + +#### 5.1.2 Update existing TUNNEL table +1. Change `dscp_mode` from `uniform` to `pipe` for TC remapping +2. Add TC remapping config if TC remapping is enabled + +```json + "TUNNEL": { + "MuxTunnel0": { + "dscp_mode": "pipe", + "dst_ip": "10.1.0.32", + "ecn_mode": "copy_from_outer", + "encap_ecn_mode": "standard", + "ttl_mode": "pipe", + "tunnel_type": "IPINIP", + "decap_dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE_TUNNEL]", + "decap_tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE_TUNNEL]", + "encap_tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE_TUNNEL]", + "encap_tc_color_to_dscp_map": "[TC_TO_DSCP_MAP|AZURE_TUNNEL]" + } + } +``` + +#### 5.1.3 Define new field for extra lossless queues +Two new fields are added to specify software or hardward PFC watchdog. + +* `pfc_wd_sw_enable` Specify the queue(s) to enable software PFC watchdog +* `pfc_wd_hw_enable` Specify the queue(s) to enable hardware PFC watchdog. + +In current version, software PFC watchdog will read field `pfc_enable` to determine PFCWD is enabled on which queue(s). To maintain compatible with current logic, `db_migrator` script is required to be updated. + +```json +"PORT_QOS_MAP": { + "Ethernet0": { + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4,2,6", + "pfc_wd_sw_enable": "3,4", + "pfc_wd_hw_enable": "2,6", + "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE|AZURE]", + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]" + } +} +``` +### 5.2 SAI attribute +TC remapping requires below SAI attributes change. +```cpp + /** + * @brief Enable TC AND COLOR -> DSCP MAP on tunnel at encapsulation (access-to-network) node to remark the DSCP in tunnel header + */ + SAI_TUNNEL_ATTR_ENCAP_QOS_TC_AND_COLOR_TO_DSCP_MAP, + + /** + * @brief Enable TC -> Queue MAP on tunnel encap + */ + SAI_TUNNEL_ATTR_ENCAP_QOS_TC_TO_QUEUE_MAP, + + /** + * @brief Enable DSCP -> TC MAP on tunnel at termination (Network-to-access) node. This map if configured overrides the port MAP + */ + SAI_TUNNEL_ATTR_DECAP_QOS_DSCP_TO_TC_MAP, + + /** + * @brief Enable TC -> Priority Group MAP. TC is derived from the tunnel MAP + */ + SAI_TUNNEL_ATTR_DECAP_QOS_TC_TO_PRIORITY_GROUP_MAP, +``` +### 5.3 Code change +1. Update `tunneldecaporch` to read and set new tunnel attributes when creating decap tunnel. +2. Update `create_tunnel` defined in `muxorch.cpp` to read and set new tunnel attributes when creating tunnel. + +## 6 Test plan +* Encap at standby side + + * Test case 1 Verify DSCP re-writing + * test case 2 Verify traffic is egressed at expected queue + * Test case 3 Verify PFC frame generation at expected queue + +* Decap at active side + + * Test case 1 Verify packets egressed to server at expected queue + * Test case 2 Verify PFC pause frame block expected queue + * Test case 3 Verify PFC frame generation at expected queue + + +## 7 Questions + +## 8 Todos +1. Update yang model +2. Confirm the usage of color to DSCP mapping +3. Confirm `pipe` mode for DSCP at decap on BRCM + \ No newline at end of file From 37a50b57f9a7d6ffa81e8a1b71b14877f38e1464 Mon Sep 17 00:00:00 2001 From: bingwang Date: Fri, 25 Feb 2022 08:46:37 +0000 Subject: [PATCH 02/14] HLD for DSCP remapping Signed-off-by: bingwang --- doc/qos/tunnel_dscp_remapping.md | 48 +++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/doc/qos/tunnel_dscp_remapping.md b/doc/qos/tunnel_dscp_remapping.md index f5bcf5af18..f46d73126b 100644 --- a/doc/qos/tunnel_dscp_remapping.md +++ b/doc/qos/tunnel_dscp_remapping.md @@ -1,29 +1,50 @@ -# TC remapping for mux tunnel - +# DSCP remapping for tunnel traffic ## 1 Table of Content ### +- [Revision](#11-revision) +- [Scope](#2-scope) +- [Definitions/Abbreviations](#3-definitionsabbreviations) +- [Overview](#4-overview) +- [Design](#5-design) + - [SWSS Schema](#51-swss-schema) + - [Define new table for mapping](#511-define-new-table-for-mapping) + - [Update existing TUNNEL table](#512-update-existing-tunnel-table) + - [Define new field for extra lossless queues](#513-define-new-field-for-extra-lossless-queues) + - [SAI attribute](#52-sai-attribute) + - [orchagent](#53-orchagent) +- [Test requirement](#6-test-requirement) +- [Open Questions](#7-open-questions) + ### 1.1 Revision ### +| Rev | Date | Author | Change Description | +|:---:|:-----------:|:------------------:|-----------------------------------| +| 0.1 | | Bing Wang | Initial version | + ## 2 Scope ## -This document will cover high level design of TC remapping in SONiC. +This document covers high level design of DSCP and TC remapping for tunnel traffic in SONiC. ## 3 Definitions/Abbreviations ## -This section covers the abbreviation if any, used in this high-level design document and its definitions. | Term | Meaning | |:--------:|:---------------------------------------------:| | PFC | Priority-based Flow Control | | TC | Traffic class| +| DSCP| Differentiated Services Code Point | + +## 4 Overview + +The current QoS map architecture allows for port-based selection of each QoS map. However, we are not able to override the port-based QoS map for tunnel traffic. +This design proposes a method to remapping DSCP and TC for IPinIP tunnel. -## 4 Overview ## ## 5 Design ## ### 5.1 SWSS Schema -#### 5.1.1 Define new table mapping +#### 5.1.1 Define new table for mapping * Table for decap DSCP_TO_TC_MAP for mapping DSCP to TC @@ -153,11 +174,15 @@ TC remapping requires below SAI attributes change. */ SAI_TUNNEL_ATTR_DECAP_QOS_TC_TO_PRIORITY_GROUP_MAP, ``` -### 5.3 Code change +### 5.3 orchagent + +Code change in orchagent + 1. Update `tunneldecaporch` to read and set new tunnel attributes when creating decap tunnel. 2. Update `create_tunnel` defined in `muxorch.cpp` to read and set new tunnel attributes when creating tunnel. -## 6 Test plan +## 6 Test requirement +All changes are to be covered by system test. * Encap at standby side * Test case 1 Verify DSCP re-writing @@ -171,10 +196,7 @@ TC remapping requires below SAI attributes change. * Test case 3 Verify PFC frame generation at expected queue -## 7 Questions +## 7 Open Questions + -## 8 Todos -1. Update yang model -2. Confirm the usage of color to DSCP mapping -3. Confirm `pipe` mode for DSCP at decap on BRCM \ No newline at end of file From 9492c497d66d83f36466ad09e0ab3c17cfd39747 Mon Sep 17 00:00:00 2001 From: bingwang Date: Fri, 25 Feb 2022 08:54:56 +0000 Subject: [PATCH 03/14] Update doc Signed-off-by: bingwang --- doc/qos/tunnel_dscp_remapping.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/qos/tunnel_dscp_remapping.md b/doc/qos/tunnel_dscp_remapping.md index f46d73126b..1877e45f60 100644 --- a/doc/qos/tunnel_dscp_remapping.md +++ b/doc/qos/tunnel_dscp_remapping.md @@ -45,6 +45,7 @@ This design proposes a method to remapping DSCP and TC for IPinIP tunnel. ### 5.1 SWSS Schema #### 5.1.1 Define new table for mapping +Please be noted that below config is to remap traffic in queue 3 to queue 2, and traffic in queue 4 to queue 6. * Table for decap DSCP_TO_TC_MAP for mapping DSCP to TC @@ -60,8 +61,7 @@ This design proposes a method to remapping DSCP and TC for IPinIP tunnel. "6": "6", "7": "1", "8": "0", - "9": "1", - ...... + "9": "1" } ``` TC_TO_PRIORITY_GROUP_MAP for mappping TC to PG From 48eec5c68ef7fad921a116880d8bf8e440e0d2b8 Mon Sep 17 00:00:00 2001 From: bingwang Date: Mon, 28 Feb 2022 02:35:00 -0800 Subject: [PATCH 04/14] Address commentes Signed-off-by: bingwang --- doc/qos/tunnel_dscp_remapping.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/doc/qos/tunnel_dscp_remapping.md b/doc/qos/tunnel_dscp_remapping.md index 1877e45f60..52748002da 100644 --- a/doc/qos/tunnel_dscp_remapping.md +++ b/doc/qos/tunnel_dscp_remapping.md @@ -45,10 +45,13 @@ This design proposes a method to remapping DSCP and TC for IPinIP tunnel. ### 5.1 SWSS Schema #### 5.1.1 Define new table for mapping +Update [qos_config.j2](https://github.com/Azure/sonic-buildimage/blob/master/files/build_templates/qos_config.j2) to generate 4 tables for remapping. Currently, the remapping is required in `dual-tor` scenario. So the tables are rendered into `config_db` only when `DEVICE_METADATA['localhost']['subtype'] = 'DualToR`. + Please be noted that below config is to remap traffic in queue 3 to queue 2, and traffic in queue 4 to queue 6. * Table for decap DSCP_TO_TC_MAP for mapping DSCP to TC + ```json "DSCP_TO_TC_MAP": { "AZURE_TUNNEL": { @@ -64,7 +67,9 @@ Please be noted that below config is to remap traffic in queue 3 to queue 2, and "9": "1" } ``` + TC_TO_PRIORITY_GROUP_MAP for mappping TC to PG + ```json "TC_TO_PRIORITY_GROUP_MAP": { "AZURE_TUNNEL": { @@ -78,9 +83,11 @@ Please be noted that below config is to remap traffic in queue 3 to queue 2, and "7": "7" } ``` + * Table for encap TC_TO_QUEUE_MAP for remapping queue + ```json "TC_TO_QUEUE_MAP": { "AZURE_TUNNEL": { @@ -94,6 +101,7 @@ Please be noted that below config is to remap traffic in queue 3 to queue 2, and "7": "7" } ``` + TC_TO_DSCP_MAP for rewriting DSCP ```json "TC_TO_DSCP_MAP": { @@ -109,6 +117,7 @@ Please be noted that below config is to remap traffic in queue 3 to queue 2, and } ``` + To support the new table, a new YANG model `sonic-tc-dscp.yang` is required #### 5.1.2 Update existing TUNNEL table 1. Change `dscp_mode` from `uniform` to `pipe` for TC remapping 2. Add TC remapping config if TC remapping is enabled @@ -151,6 +160,10 @@ In current version, software PFC watchdog will read field `pfc_enable` to determ } } ``` + +To support new field `pfc_wd_sw_enable` and `pfc_wd_hw_enable`, [sonic-port-qos-map.yang](https://github.com/Azure/sonic-buildimage/blob/master/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang) is required to be updated. + + ### 5.2 SAI attribute TC remapping requires below SAI attributes change. ```cpp @@ -179,8 +192,17 @@ TC remapping requires below SAI attributes change. Code change in orchagent 1. Update `tunneldecaporch` to read and set new tunnel attributes when creating decap tunnel. -2. Update `create_tunnel` defined in `muxorch.cpp` to read and set new tunnel attributes when creating tunnel. + | Attribute | Value | + |---|-----------| + | SAI_TUNNEL_ATTR_ENCAP_QOS_TC_AND_COLOR_TO_DSCP_MAP | [TC_TO_DSCP_MAP\|AZURE_TUNNEL]| + | SAI_TUNNEL_ATTR_ENCAP_QOS_TC_TO_QUEUE_MAP | [TC_TO_QUEUE_MAP\|AZURE_TUNNEL] | + +2. Update `create_tunnel` defined in `muxorch.cpp` to read and set new tunnel attributes when creating tunnel. + | Attribute | Value | + |---|-----------| + | SAI_TUNNEL_ATTR_DECAP_QOS_DSCP_TO_TC_MAP | [DSCP_TO_TC_MAP\|AZURE_TUNNEL]| + | SAI_TUNNEL_ATTR_DECAP_QOS_TC_TO_PRIORITY_GROUP_MAP | [TC_TO_PRIORITY_GROUP_MAP\|AZURE_TUNNEL | ## 6 Test requirement All changes are to be covered by system test. * Encap at standby side From 12d907ff91fc577cbd6dfd9c74f308a41f83a811 Mon Sep 17 00:00:00 2001 From: bingwang Date: Thu, 3 Mar 2022 22:28:42 -0800 Subject: [PATCH 05/14] Add an img to cover user scenario Signed-off-by: bingwang --- .../Bounced-back-traffic-flow.png | Bin 0 -> 36021 bytes doc/qos/tunnel_dscp_remapping.md | 8 +++++++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 doc/qos/dscp-remapping-images/Bounced-back-traffic-flow.png diff --git a/doc/qos/dscp-remapping-images/Bounced-back-traffic-flow.png b/doc/qos/dscp-remapping-images/Bounced-back-traffic-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..44f806d5f919661d0d63c3631b8ebe87d1558465 GIT binary patch literal 36021 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 AT3(WneS|cp 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 z +Figure 1. Bounced back traffic flow +

The current QoS map architecture allows for port-based selection of each QoS map. However, we are not able to override the port-based QoS map for tunnel traffic. -This design proposes a method to remapping DSCP and TC for IPinIP tunnel. +This design proposes a method to remapping DSCP and TC for tunnel traffic. ## 5 Design ## @@ -48,6 +53,7 @@ This design proposes a method to remapping DSCP and TC for IPinIP tunnel. Update [qos_config.j2](https://github.com/Azure/sonic-buildimage/blob/master/files/build_templates/qos_config.j2) to generate 4 tables for remapping. Currently, the remapping is required in `dual-tor` scenario. So the tables are rendered into `config_db` only when `DEVICE_METADATA['localhost']['subtype'] = 'DualToR`. Please be noted that below config is to remap traffic in queue 3 to queue 2, and traffic in queue 4 to queue 6. +Before remapping to queue 4 and 6, both queues are required to be cleared. Hence the current `DSCP_TO_TC_MAP|AZURE` in [qos_config.j2](https://github.com/Azure/sonic-buildimage/blob/master/files/build_templates/qos_config.j2) is required to be updated to map DSCP `5` and `48` into other queues. * Table for decap DSCP_TO_TC_MAP for mapping DSCP to TC From b7980dbe5fa48cabdbf2129499bb6e20ae137a39 Mon Sep 17 00:00:00 2001 From: bingwang Date: Thu, 3 Mar 2022 22:31:58 -0800 Subject: [PATCH 06/14] Fix new line Signed-off-by: bingwang --- doc/qos/tunnel_dscp_remapping.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/qos/tunnel_dscp_remapping.md b/doc/qos/tunnel_dscp_remapping.md index 6960512bbd..4b7499103e 100644 --- a/doc/qos/tunnel_dscp_remapping.md +++ b/doc/qos/tunnel_dscp_remapping.md @@ -38,6 +38,7 @@ This document covers high level design of DSCP and TC remapping for tunnel traff ## 4 Overview In Dual-ToR scenario, PFC deadlock can happen if two servers are congested at same time and start sending PFC pause frames to both upper ToR and lower ToR. It is because the south bound traffic from T1 to standby ToR is bounced back to T1 via the same queue. Even when the block condition is resolved, the pause condition among T1 and both ToRs can stay forever and no traffic will go through. + To avoid this scenario, the bounced-back traffic from standby ToR to T1 will be remapped into another queue. For example, the traffic flow is as below if we are going to remap traffic in queue 3 to queue 2.

Figure 1. Bounced back traffic flow From 5b6e794c4acecb061a5d315e0cb2a2083aee820f Mon Sep 17 00:00:00 2001 From: bingwang Date: Mon, 7 Mar 2022 00:15:19 -0800 Subject: [PATCH 07/14] Add traffic flow with PFC Signed-off-by: bingwang --- .../Bounced-back-traffic-flow-PFC.png | Bin 0 -> 52845 bytes .../Bounced-back-traffic-flow.png | Bin 36021 -> 40062 bytes doc/qos/tunnel_dscp_remapping.md | 7 +++++++ 3 files changed, 7 insertions(+) create mode 100644 doc/qos/dscp-remapping-images/Bounced-back-traffic-flow-PFC.png diff --git a/doc/qos/dscp-remapping-images/Bounced-back-traffic-flow-PFC.png b/doc/qos/dscp-remapping-images/Bounced-back-traffic-flow-PFC.png new file mode 100644 index 0000000000000000000000000000000000000000..d34702a688121dbf5764152cab4806de1457fb93 GIT binary patch literal 52845 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 T6sp;;iU*FiE;eQRe!c$RdYfHt literal 36021 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 AT3(WneS|cp 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 z Figure 1. Bounced back traffic flow

+ +When congestion happens on server, the traffic flow of PFC pause frames is as below diagram. + +

+Figure 2. Bounced back traffic flow with PFC pause +

The current QoS map architecture allows for port-based selection of each QoS map. However, we are not able to override the port-based QoS map for tunnel traffic. This design proposes a method to remapping DSCP and TC for tunnel traffic. From 55024e8df607ee8eaaa61132e2feb66524d0e407 Mon Sep 17 00:00:00 2001 From: bingwang Date: Fri, 18 Mar 2022 01:16:32 -0700 Subject: [PATCH 08/14] Add detailed map Signed-off-by: bingwang --- doc/qos/tunnel_dscp_remapping.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/doc/qos/tunnel_dscp_remapping.md b/doc/qos/tunnel_dscp_remapping.md index 1617383eb9..f38bd52d72 100644 --- a/doc/qos/tunnel_dscp_remapping.md +++ b/doc/qos/tunnel_dscp_remapping.md @@ -117,6 +117,7 @@ Before remapping to queue 4 and 6, both queues are required to be cleared. Hence ``` TC_TO_DSCP_MAP for rewriting DSCP + ```json "TC_TO_DSCP_MAP": { "AZURE_TUNNEL": { @@ -201,6 +202,25 @@ TC remapping requires below SAI attributes change. */ SAI_TUNNEL_ATTR_DECAP_QOS_TC_TO_PRIORITY_GROUP_MAP, ``` +For instance, when we get a traffic flow with DSCP = 3 on T1, the traffic and bounced back traffic is delivered and remapped as below: + +1. Traffic from `T1` to `Standby ToR` + - Traffic mapped to `TC3`, `PG3` and `Queue 3` by port level QoS mapping +2. Bounced back traffic from `Standby ToR` to `T1` + - Traffic arrived at `Standby ToR` in `TC3`, `PG3` and `Queue 3` as per port level QoS mapping + - Packet will be encapped and delivered back to `T1` by `MuxTunnel` + - The outer `DSCP` is rewritten to `2` as specified in `TC_TO_DSCP_MAP|AZURE_TUNNEL` by SAI attribute `SAI_TUNNEL_ATTR_ENCAP_QOS_TC_AND_COLOR_TO_DSCP_MAP`. + - Traffic is delivered in `Queue 2` as specified in `TC_TO_QUEUE_MAP|AZURE_TUNNEL` by SAI attribute `SAI_TUNNEL_ATTR_ENCAP_QOS_TC_TO_QUEUE_MAP` +3. Bounced back traffic from `T1` to `Active ToR` + - Bounced back traffic arrive at `T1` in `Queue 2` and `PG2` by port level QoS mapping + - Bounced back traffic will be routed to `Active ToR` +4. Traffic from `Active ToR` to `Server` + - Traffic arrived at `Active ToR` and will be decapped and delivered to server + - The outer `DSCP` is ignored as the `dscp_mode` for `MuxTunnel` is `PIPE`. The inner `DSCP3` is copied to outer layer + - Traffic is remapped to `TC 3` as specified in `DSCP_TO_TC_MAP|AZURE_TUNNEL` by SAI attribute `SAI_TUNNEL_ATTR_DECAP_QOS_DSCP_TO_TC_MAP` + - Traffic is remapped to `PG 2` as specified in `TC_TO_PRIORITY_GROUP_MAP|AZURE_TUNNEL` by SAI attribute `SAI_TUNNEL_ATTR_DECAP_QOS_TC_TO_PRIORITY_GROUP_MAP` + - Traffic is in `Queue 3` as per port level QoS mapping + - Decapped traffic is delivered to target server ### 5.3 orchagent Code change in orchagent From bec34175e12021c05360fcbc77d56cf93613fc8c Mon Sep 17 00:00:00 2001 From: bingwang Date: Wed, 23 Mar 2022 01:41:10 -0700 Subject: [PATCH 09/14] Fix incorrect table Signed-off-by: bingwang --- doc/qos/tunnel_dscp_remapping.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/qos/tunnel_dscp_remapping.md b/doc/qos/tunnel_dscp_remapping.md index f38bd52d72..7c46f9a76e 100644 --- a/doc/qos/tunnel_dscp_remapping.md +++ b/doc/qos/tunnel_dscp_remapping.md @@ -229,14 +229,16 @@ Code change in orchagent | Attribute | Value | |---|-----------| - | SAI_TUNNEL_ATTR_ENCAP_QOS_TC_AND_COLOR_TO_DSCP_MAP | [TC_TO_DSCP_MAP\|AZURE_TUNNEL]| - | SAI_TUNNEL_ATTR_ENCAP_QOS_TC_TO_QUEUE_MAP | [TC_TO_QUEUE_MAP\|AZURE_TUNNEL] | + | SAI_TUNNEL_ATTR_DECAP_QOS_DSCP_TO_TC_MAP | [DSCP_TO_TC_MAP\|AZURE_TUNNEL]| + | SAI_TUNNEL_ATTR_DECAP_QOS_TC_TO_PRIORITY_GROUP_MAP | [TC_TO_PRIORITY_GROUP_MAP\|AZURE_TUNNEL | 2. Update `create_tunnel` defined in `muxorch.cpp` to read and set new tunnel attributes when creating tunnel. + | Attribute | Value | |---|-----------| - | SAI_TUNNEL_ATTR_DECAP_QOS_DSCP_TO_TC_MAP | [DSCP_TO_TC_MAP\|AZURE_TUNNEL]| - | SAI_TUNNEL_ATTR_DECAP_QOS_TC_TO_PRIORITY_GROUP_MAP | [TC_TO_PRIORITY_GROUP_MAP\|AZURE_TUNNEL | + | SAI_TUNNEL_ATTR_ENCAP_QOS_TC_AND_COLOR_TO_DSCP_MAP | [TC_TO_DSCP_MAP\|AZURE_TUNNEL]| + | SAI_TUNNEL_ATTR_ENCAP_QOS_TC_TO_QUEUE_MAP | [TC_TO_QUEUE_MAP\|AZURE_TUNNEL] | + ## 6 Test requirement All changes are to be covered by system test. * Encap at standby side From b41966b2c6899467d4d40c5b9c93d844f0fbb266 Mon Sep 17 00:00:00 2001 From: bingwang Date: Thu, 24 Mar 2022 00:51:38 -0700 Subject: [PATCH 10/14] Add full list Signed-off-by: bingwang --- doc/qos/tunnel_dscp_remapping.md | 88 ++++++++++++++++++++++++++------ 1 file changed, 71 insertions(+), 17 deletions(-) diff --git a/doc/qos/tunnel_dscp_remapping.md b/doc/qos/tunnel_dscp_remapping.md index 7c46f9a76e..11660c1c61 100644 --- a/doc/qos/tunnel_dscp_remapping.md +++ b/doc/qos/tunnel_dscp_remapping.md @@ -69,16 +69,70 @@ Before remapping to queue 4 and 6, both queues are required to be cleared. Hence ```json "DSCP_TO_TC_MAP": { "AZURE_TUNNEL": { - "0": "1", - "1": "1", - "2": "2", - "3": "3", - "4": "4", - "5": "1", - "6": "6", - "7": "1", - "8": "0", - "9": "1" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "1", // Original map "5" : "2" + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "7", // Original map "48" : "6". + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } ``` @@ -90,8 +144,8 @@ Before remapping to queue 4 and 6, both queues are required to be cleared. Hence "0": "0", "1": "0", "2": "0", - "3": "2", - "4": "6", + "3": "2", // Original map "3" : "3" + "4": "6", // Original map "4" : "4" "5": "0", "6": "0", "7": "7" @@ -107,16 +161,16 @@ Before remapping to queue 4 and 6, both queues are required to be cleared. Hence "AZURE_TUNNEL": { "0": "0", "1": "1", - "2": "1", - "3": "2", - "4": "6", + "2": "1", // Original map "2" : "2" + "3": "2", // Original map "3" : "3" + "4": "6", // Original map "4" : "4" "5": "5", - "6": "1", + "6": "1", // Original map "6" : "6" "7": "7" } ``` - TC_TO_DSCP_MAP for rewriting DSCP + TC_TO_DSCP_MAP for rewriting DSCP. This map is newly added. ```json "TC_TO_DSCP_MAP": { From 76baf8ae7aa7898189a0fd476d6aa10b0becab00 Mon Sep 17 00:00:00 2001 From: bingwang Date: Thu, 24 Mar 2022 04:43:14 -0700 Subject: [PATCH 11/14] Add deadlock img Signed-off-by: bingwang --- .../Bounced-back-traffic-deadlock.png | Bin 0 -> 64115 bytes doc/qos/tunnel_dscp_remapping.md | 7 +++++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 doc/qos/dscp-remapping-images/Bounced-back-traffic-deadlock.png diff --git a/doc/qos/dscp-remapping-images/Bounced-back-traffic-deadlock.png b/doc/qos/dscp-remapping-images/Bounced-back-traffic-deadlock.png new file mode 100644 index 0000000000000000000000000000000000000000..c3935332413d199249c6b7bdf6fc12364f8f57c5 GIT binary patch literal 64115 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 literal 0 HcmV?d00001 diff --git a/doc/qos/tunnel_dscp_remapping.md b/doc/qos/tunnel_dscp_remapping.md index 11660c1c61..27cece406f 100644 --- a/doc/qos/tunnel_dscp_remapping.md +++ b/doc/qos/tunnel_dscp_remapping.md @@ -38,17 +38,20 @@ This document covers high level design of DSCP and TC remapping for tunnel traff ## 4 Overview In Dual-ToR scenario, PFC deadlock can happen if two servers are congested at same time and start sending PFC pause frames to both upper ToR and lower ToR. It is because the south bound traffic from T1 to standby ToR is bounced back to T1 via the same queue. Even when the block condition is resolved, the pause condition among T1 and both ToRs can stay forever and no traffic will go through. +

+Figure 1. Bounced back traffic deadloack +

To avoid this scenario, the bounced-back traffic from standby ToR to T1 will be remapped into another queue. For example, the traffic flow is as below if we are going to remap traffic in queue 3 to queue 2.

-Figure 1. Bounced back traffic flow +Figure 2. Bounced back traffic flow

When congestion happens on server, the traffic flow of PFC pause frames is as below diagram.

-Figure 2. Bounced back traffic flow with PFC pause +Figure 3. Bounced back traffic flow with PFC pause

The current QoS map architecture allows for port-based selection of each QoS map. However, we are not able to override the port-based QoS map for tunnel traffic. This design proposes a method to remapping DSCP and TC for tunnel traffic. From eadfc895b0d361845039276928b6cfe5dea9b23e Mon Sep 17 00:00:00 2001 From: bingwang Date: Thu, 24 Mar 2022 22:54:14 -0700 Subject: [PATCH 12/14] Address comments Signed-off-by: bingwang --- doc/qos/tunnel_dscp_remapping.md | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/doc/qos/tunnel_dscp_remapping.md b/doc/qos/tunnel_dscp_remapping.md index 27cece406f..f2e605ceb3 100644 --- a/doc/qos/tunnel_dscp_remapping.md +++ b/doc/qos/tunnel_dscp_remapping.md @@ -212,10 +212,9 @@ Before remapping to queue 4 and 6, both queues are required to be cleared. Hence ``` #### 5.1.3 Define new field for extra lossless queues -Two new fields are added to specify software or hardward PFC watchdog. +Two new fields are added to specify on which queue to enable PFC watchdog. * `pfc_wd_sw_enable` Specify the queue(s) to enable software PFC watchdog -* `pfc_wd_hw_enable` Specify the queue(s) to enable hardware PFC watchdog. In current version, software PFC watchdog will read field `pfc_enable` to determine PFCWD is enabled on which queue(s). To maintain compatible with current logic, `db_migrator` script is required to be updated. @@ -225,7 +224,6 @@ In current version, software PFC watchdog will read field `pfc_enable` to determ "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", "pfc_enable": "3,4,2,6", "pfc_wd_sw_enable": "3,4", - "pfc_wd_hw_enable": "2,6", "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE|AZURE]", "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]" @@ -233,7 +231,7 @@ In current version, software PFC watchdog will read field `pfc_enable` to determ } ``` -To support new field `pfc_wd_sw_enable` and `pfc_wd_hw_enable`, [sonic-port-qos-map.yang](https://github.com/Azure/sonic-buildimage/blob/master/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang) is required to be updated. +To support new field `pfc_wd_sw_enable`, [sonic-port-qos-map.yang](https://github.com/Azure/sonic-buildimage/blob/master/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang) is required to be updated. ### 5.2 SAI attribute @@ -262,22 +260,24 @@ TC remapping requires below SAI attributes change. For instance, when we get a traffic flow with DSCP = 3 on T1, the traffic and bounced back traffic is delivered and remapped as below: 1. Traffic from `T1` to `Standby ToR` - - Traffic mapped to `TC3`, `PG3` and `Queue 3` by port level QoS mapping + - Traffic mapped to `TC3` and `PG3`by port level QoS mapping 2. Bounced back traffic from `Standby ToR` to `T1` - - Traffic arrived at `Standby ToR` in `TC3`, `PG3` and `Queue 3` as per port level QoS mapping + - Traffic arrived at `Standby ToR` in `TC3` and `PG3` as per port level QoS mapping - Packet will be encapped and delivered back to `T1` by `MuxTunnel` - The outer `DSCP` is rewritten to `2` as specified in `TC_TO_DSCP_MAP|AZURE_TUNNEL` by SAI attribute `SAI_TUNNEL_ATTR_ENCAP_QOS_TC_AND_COLOR_TO_DSCP_MAP`. - Traffic is delivered in `Queue 2` as specified in `TC_TO_QUEUE_MAP|AZURE_TUNNEL` by SAI attribute `SAI_TUNNEL_ATTR_ENCAP_QOS_TC_TO_QUEUE_MAP` 3. Bounced back traffic from `T1` to `Active ToR` - - Bounced back traffic arrive at `T1` in `Queue 2` and `PG2` by port level QoS mapping + - Bounced back traffic arrive at `T1` and `PG2` by port level QoS mapping - Bounced back traffic will be routed to `Active ToR` 4. Traffic from `Active ToR` to `Server` - Traffic arrived at `Active ToR` and will be decapped and delivered to server - - The outer `DSCP` is ignored as the `dscp_mode` for `MuxTunnel` is `PIPE`. The inner `DSCP3` is copied to outer layer + - The outer `DSCP` is ignored as the `dscp_mode` for `MuxTunnel` is `PIPE`. The inner `DSCP3` is unchanged. - Traffic is remapped to `TC 3` as specified in `DSCP_TO_TC_MAP|AZURE_TUNNEL` by SAI attribute `SAI_TUNNEL_ATTR_DECAP_QOS_DSCP_TO_TC_MAP` - Traffic is remapped to `PG 2` as specified in `TC_TO_PRIORITY_GROUP_MAP|AZURE_TUNNEL` by SAI attribute `SAI_TUNNEL_ATTR_DECAP_QOS_TC_TO_PRIORITY_GROUP_MAP` - Traffic is in `Queue 3` as per port level QoS mapping - Decapped traffic is delivered to target server + +The new SAI attributes are to be target at branch `202012` and `202205`. ### 5.3 orchagent Code change in orchagent @@ -296,6 +296,12 @@ Code change in orchagent | SAI_TUNNEL_ATTR_ENCAP_QOS_TC_AND_COLOR_TO_DSCP_MAP | [TC_TO_DSCP_MAP\|AZURE_TUNNEL]| | SAI_TUNNEL_ATTR_ENCAP_QOS_TC_TO_QUEUE_MAP | [TC_TO_QUEUE_MAP\|AZURE_TUNNEL] | +3. Update code for handling decap terminator +Since both the `MuxTunnel` and regular IPinIP tunnel use Loopback address `10.1.0.32` as the `dst_ip`, they will share the same decap terminator. It may pose a conflict when we are going to apply extra attributes to `MuxTunnel`. +To avoid the potential conflict, we have to create two separate tunnel terminators, one for MuxTunnel and one for regular IPinIP tunnel +- For `MuxTunnel`, the type of terminator would be `P2P` as we have a specific `src_ip`, which is the peer's Loopback address. +- For regular IPinIP tunnel, the type of terminator is unchanged, which is `P2MP`. + ## 6 Test requirement All changes are to be covered by system test. * Encap at standby side From 29e67ca0064c6ead046b42867a55151ef59bff93 Mon Sep 17 00:00:00 2001 From: bingwang Date: Sun, 27 Mar 2022 23:27:53 -0700 Subject: [PATCH 13/14] TC7 -> PG0 Signed-off-by: bingwang --- doc/qos/tunnel_dscp_remapping.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/qos/tunnel_dscp_remapping.md b/doc/qos/tunnel_dscp_remapping.md index f2e605ceb3..be3ddcabf9 100644 --- a/doc/qos/tunnel_dscp_remapping.md +++ b/doc/qos/tunnel_dscp_remapping.md @@ -151,7 +151,7 @@ Before remapping to queue 4 and 6, both queues are required to be cleared. Hence "4": "6", // Original map "4" : "4" "5": "0", "6": "0", - "7": "7" + "7": "0" // Original map "7" : "7" } ``` @@ -212,11 +212,12 @@ Before remapping to queue 4 and 6, both queues are required to be cleared. Hence ``` #### 5.1.3 Define new field for extra lossless queues -Two new fields are added to specify on which queue to enable PFC watchdog. +Since we are going to have two extra lossless queues, while we are not going to enable watchdog on these two new queues, we need a new field to specify on which queue to enable PFC watchdog. -* `pfc_wd_sw_enable` Specify the queue(s) to enable software PFC watchdog +* `pfc_enable` Specify on which queue to enable PFC +* `pfc_wd_sw_enable` Specify the queue(s) to enable PFC watchdog -In current version, software PFC watchdog will read field `pfc_enable` to determine PFCWD is enabled on which queue(s). To maintain compatible with current logic, `db_migrator` script is required to be updated. +In current version, PFC watchdog will read `pfc_enable` to determine PFCWD is enabled on which queue(s). To maintain compatible with current logic, `db_migrator` script is required to be updated. ```json "PORT_QOS_MAP": { From 909691c25f22c415748d367304405f471d10856c Mon Sep 17 00:00:00 2001 From: bingwang Date: Mon, 28 Mar 2022 18:35:49 -0700 Subject: [PATCH 14/14] Fix typo Signed-off-by: bingwang --- doc/qos/tunnel_dscp_remapping.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/qos/tunnel_dscp_remapping.md b/doc/qos/tunnel_dscp_remapping.md index be3ddcabf9..c93e787c67 100644 --- a/doc/qos/tunnel_dscp_remapping.md +++ b/doc/qos/tunnel_dscp_remapping.md @@ -64,7 +64,7 @@ This design proposes a method to remapping DSCP and TC for tunnel traffic. Update [qos_config.j2](https://github.com/Azure/sonic-buildimage/blob/master/files/build_templates/qos_config.j2) to generate 4 tables for remapping. Currently, the remapping is required in `dual-tor` scenario. So the tables are rendered into `config_db` only when `DEVICE_METADATA['localhost']['subtype'] = 'DualToR`. Please be noted that below config is to remap traffic in queue 3 to queue 2, and traffic in queue 4 to queue 6. -Before remapping to queue 4 and 6, both queues are required to be cleared. Hence the current `DSCP_TO_TC_MAP|AZURE` in [qos_config.j2](https://github.com/Azure/sonic-buildimage/blob/master/files/build_templates/qos_config.j2) is required to be updated to map DSCP `5` and `48` into other queues. +Before remapping to queue 2 and 6, both queues are required to be cleared. Hence the current `DSCP_TO_TC_MAP|AZURE` in [qos_config.j2](https://github.com/Azure/sonic-buildimage/blob/master/files/build_templates/qos_config.j2) is required to be updated. * Table for decap DSCP_TO_TC_MAP for mapping DSCP to TC