From 1e05640993b3af2509d016d62bcaf44a18eca190 Mon Sep 17 00:00:00 2001 From: Mohanarajan Selvaraj Date: Fri, 16 Aug 2019 11:20:59 -0700 Subject: [PATCH 1/6] This document describes the functionality and high level desigh of broadcast, unknown-unicast and unknown-multicast storm-control feature in SONiC --- .../bum_storm_control_hld.md | 411 ++++++++++++++++++ .../images/storm_control_architecture.png | Bin 0 -> 21052 bytes .../images/storm_control_disable_on_port.png | Bin 0 -> 16127 bytes .../images/storm_control_enable_on_port.png | Bin 0 -> 16269 bytes .../images/storm_control_update_on_port.png | Bin 0 -> 19513 bytes 5 files changed, 411 insertions(+) create mode 100644 doc/bum_storm_control/bum_storm_control_hld.md create mode 100644 doc/bum_storm_control/images/storm_control_architecture.png create mode 100644 doc/bum_storm_control/images/storm_control_disable_on_port.png create mode 100644 doc/bum_storm_control/images/storm_control_enable_on_port.png create mode 100644 doc/bum_storm_control/images/storm_control_update_on_port.png diff --git a/doc/bum_storm_control/bum_storm_control_hld.md b/doc/bum_storm_control/bum_storm_control_hld.md new file mode 100644 index 0000000000..e3317cd2dc --- /dev/null +++ b/doc/bum_storm_control/bum_storm_control_hld.md @@ -0,0 +1,411 @@ + +# SONiC BUM Storm Control +# High Level Design Document +#### Rev 0.1 + + +# Table of Contents + * [List of Tables](#list-of-tables) + * [Revision](#revision) + * [About This Manual](#about-this-manual) + * [Scope](#scope) + * [Definition/Abbreviation](#definitionabbreviation) + * [1 Feature Overview](#1-feature-overview) + * [1.1 Requirements](#11-requirements) + * [1.1.1 Functional Requirements](#111-functional-requirements) + * [1.1.2 Configuration and Management Requirements](#112-configuration-and-management-requirements) + * [1.1.3 Scalability Requirements](#113-scalability-requirements) + * [1.1.4 Warm Boot Requirements](#114-warm-boot-requirements) + * [1.2 Design Overview](#12-design-overview) + * [1.2.1 Basic Approach](#121-basic-approach) + * [1.2.2 Container](#122-container) + * [1.2.3 SAI Overview](#123-sai-overview) + * [2 Functionality](#2-functionality) + * [2.1 Target Deployment Use Cases](#21-target-deployment-use-cases) + * [2.2 Functional Description](#22-functional-description) + * [2.3 Limitations](#23-limitations) + * [3 Design](#3-design) + * [3.1 Overview](#31-overview) + * [3.2 DB Changes](#32-db-changes) + * [3.2.1 CONFIG_DB](#321-config_db) + * [3.2.2 APP_DB](#322-app_db) + * [3.2.3 STATE_DB](#323-state_db) + * [3.2.4 ASIC_DB](#324-asic_db) + * [3.2.5 COUNTER_DB](#325-counter_db) + * [3.3 Switch State Service Design](#33-switch-state-service-design) + * [3.3.1 PolicerOrch changes](#331-policerorch-changes) + * [3.4 SAI](#34-sai) + * [3.5 CLI](#35-cli) + * [3.5.1 Data Models](#351-data-models) + * [3.5.2 Configuration Commands](#352-configuration-commands) + * [3.5.3 Show Commands](#353-show-commands) + * [3.5.4 Clear Commands](#354-clear-commands) + * [3.5.5 Debug Commands](#355-debug-commands) + * [3.5.6 Rest API Support](#356-rest-api-support) + * [4 Flow Diagrams](#4-flow-diagrams) + * [4.1 Enable storm control on physical interface](#41-enable-storm-control-on-phy) + * [4.2 Disable storm Control on physical interface](#42-disable-storm-control-on-phy) + * [4.3 Update storm Control on physical interface](#43-update-storm-control-on-phy) + * [5 Error Handling](#5-error-handling) + * [6 Serviceability and Debug](#6-serviceability-and-debug) + * [7 Warm Boot Support](#7-warm-boot-support) + * [8 Scalability](#8-scalability) + * [9 Unit Test](#9-unit-test) + * [9.1 CLI Test Cases](#91-cli-test-cases) + * [9.2 REST API Test Cases](#92-rest-api-test-cases) + * [9.3 Functional Test Cases](#93-functional-test-cases) + * [9.4 Scaling Test Cases](#94-scaling-test-cases) + * [9.5 Warm Boot Test Cases](#95-warm-boot-test-cases) + * [9.6 Negative Test Cases](#96-negative-test-cases) + + +# List of Tables +[Table 1: Abbreviations](#table-1-abbreviations) +[Table 2: Storm Control SAI attributes](#table-2-storm-control-sai-attributes) + + +# Revision +| Rev | Date | Author | Change Description | +|:---:|:-----------:|:------------------:|-----------------------------------| +| 0.1 | 06/24/2019 | Mohanarajan Selvaraj| Initial version | + + +# About this Manual +This document provides general information about Broadcast, Unknown-unicast and unknown-Multicast storm-control feature implementation in SONiC. +# Scope +This document describes the functionality and high level design of Broadcast, Unknown-unicast and unknown-Multicast storm-control feature in SONiC. + + + + +# Definition/Abbreviation +### Table 1: Abbreviations +| Term | Meaning | +|--------|--------------------------------------------------------| +| BUM | Broadcast Unknown-unicast and unknown-Multicast | + + +# 1 Feature Overview +A traffic storm occurs when packets flood the LAN, creating excessive traffic and degrading network performance. The type of traffic can be Broadcast, Unknown-unicast or unknown-Multicast (BUM). +The storm-control feature allows the user to limit the amount of BUM traffic admitted to the system. This can be achieved by configuring the type of storm (Broadcast or Unknown-unicast or unknown-Multicast) and the corresponding bits per second (bps) parameter on a given physical interface. Traffic that exceeds the configured rate will be dropped. +Unknown-multicast traffic consists of all multicast traffic which donot match any of the statically configured or dynamically learned multicast groups. + + + +## 1.1 Requirements + + +### 1.1.1 Functional Requirements + 1. Support configuration of Broadcast, Unknown-unicast and unknown-Multicast storm-control independently on physical interfaces. + 2. Support threshold rate configuration in bits per second (bps) in the range of 0 bps to 100Gbps. + +### 1.1.2 Configuration and Management Requirements +This feature will support SONiC CLI. + 1. Support a CLI to add or delete broadcast, unknown-unicast and unknown-multicast storm-control on a physical interface as described in "Configuration Commands" section below. + 2. Support show commands to display the storm-control configuration as described in "Show Commands" section below. + 3. Support debug commands as described in "Debug Commands" section below. + 4. Support openconfig REST API and gNMI. + + +### 1.1.3 Scalability Requirements +Storm-control configuration is done on physical ports. Hence it should be supported on all physical ports of the system. + +### 1.1.4 Warm Boot Requirements +Storm-control functionality should continue to work across warm reboot. + +- To support planned system warm boot. +- To support SWSS docker warm boot. + + +## 1.2 Design Overview + + +### 1.2.1 Basic Approach +The Policer Orchestration agent is used for handling BUM storm-control configuration. + +### 1.2.2 Container +No new containers are introduced. Functionality is added to the existing swss container. + +### 1.2.3 SAI Overview +The existing SAI policer and interface APIs shall be used to support this feature and they are available at below location, +https://github.com/opencomputeproject/SAI/blob/master/inc/saipolicer.h
+https://github.com/opencomputeproject/SAI/blob/master/inc/saiport.h + + +The details of the changes will be discussed in the design section below. + + +# 2 Functionality +Refer to section 1 +## 2.1 Target Deployment Use Cases +Any Layer-2 network segment where unknown-unicast / broadcast / unknown-multicast traffic storm should be controlled. + + +## 2.2 Functional Description +Refer to section 1.1 + +## 2.3 Limitations +BUM storm control +- Configuration is not supported on VLAN and port-channel interfaces. +- Statistics is not supported. + + + +# 3 Design +## 3.1 Overview + + +![Storm Control](images/storm_control_architecture.png "Figure 1: Storm control High Level Architecture") + + +__Figure 1: Storm Control High Level Architecture__ + +1) Storm-control configurations are parsed and stored in CFG_PORT_STORM_CONTROL_TABLE in Configuration database by the Management Framework. +2) The Policer Orchestration Agent subscribes to notifications from the CFG_PORT_STORM_CONTROL_TABLE and parses the input parameters (interface, storm-control type, bps). A policer_name is created internally by encoding the interface_name and storm_control_type. +3) create_policer SAI API is invoked to create a policer with the given input parameters. +4) The identifier of the policer created is associated with the encoded policer_name. +5) The policer identifier is passed to set_port_attribute SAI API to set the appropriate type of storm-control on the port. + + +## 3.2 DB Changes +This section describes the changes made to different DBs for supporting storm-control. + + +### 3.2.1 CONFIG_DB +A new table CFG_PORT_STORM_CONTROL_TABLE is introduced in the configuration database for the purpose of storing storm-control configuration parameters. This table is filled by the management framework. +#### CFG_PORT_STORM_CONTROL_TABLE + + ;Store Storm Control configuration per physical port + ;Status: work in progress + ;storm control type - broadcast / unknown-unicast / unknown-multicast + key = CFG_PORT_STORM_CONTROL_TABLE:port:storm_control_type ; Ethernet Interface Name and storm control type + ;field = value + enabled = BIT ; Is the storm control enabled (1) or disabled (0) on the interface + bps = 1*13 DIGIT ; CIR value in bits per second + +### 3.2.2 APP_DB +No tables are introduced in APP_DB +### 3.2.3 STATE_DB +No tables are introduced in STATE_DB. + +### 3.2.4 ASIC_DB +No changes are introduced in ASIC_DB. +### 3.2.5 COUNTER_DB +No changes are introduced in COUNTER_DB. + + +## 3.3 Switch State Service Design +### 3.3.1 PolicerOrch changes +Policer Orchestration agent is responsible for the following activities: + - Subscribes to notifications on CFG_PORT_STORM_CONTROL_TABLE entries in the CONFIG_DB. + - Creates an internal name for policer by encoding the interface name and storm-control type. + - Creates the policer based on the parameters and associates the policer identifier to internal name + - Populates the port attribute SAI structures and pushes the entry to ASIC_DB. + + +## 3.4 SAI +Storm-control SAI interface APIs are already defined. The table below represents the SAI attributes which shall be used for BUM storm-control. + + +###### Table 2: Storm Control SAI attributes +| Storm Control component | SAI attributes | +|--------------------------|--------------------------------------------------------| +| Meter type | SAI_POLICER_ATTR_METER_TYPE | +| Meter mode | SAI_POLICER_ATTR_MODE | +| CIR (bps) | SAI_POLICER_ATTR_CIR | +| Unknown-unicast policer | SAI_PORT_ATTR_FLOOD_STORM_CONTROL_POLICER_ID | +| Broadcast policer | SAI_PORT_ATTR_BROADCAST_STORM_CONTROL_POLICER_ID | +| Unknown-Multicast policer| SAI_PORT_ATTR_MULTICAST_STORM_CONTROL_POLICER_ID | + + +The BUM storm-control feature can be enabled on a physical port. + +The **create_policer** SAI API is used to create the policer based on the policer parameters listed in Table 2. + - Meter Type - Can be packets or bytes. Storm-control uses bytes meter type. + - Meter Mode - Can be st_tcm or tr_tcm or storm. Storm-control uses storm meter mode. + - CIR (bps) - Value of CIR configured in bps. + +The **set_port_attribute** SAI API is used to set the policer on an interface. + - Unknown-unicast policer - Enables storm-control for unknown-unicast traffic received on the interface. + - Broadcast policer - Enables storm-control for broadcast traffic received on the interface. + - Unknown-multicast policer - Enables storm-control for unknown-multicast traffic received on the interface. + +## 3.5 CLI +### 3.5.1 Data Models +Custom Yang model will be introduced for this feature. + + +### 3.5.2 Configuration Commands +BUM storm-control can be configured only on physical interfaces. +**switch# configure terminal**
+**switch(config)# interface Ethernet **
+**switch(config-if)# storm-control {broadcast | unknown-unicast | unknown-multicast} {bps \}** + + +#### 3.5.2.1 Enable Broadcast storm control on a physical interface +This command configures broadcast storm-control on a physical interface.
+**switch(config-if)# storm-control broadcast {bps \}** + + +#### 3.5.2.1 Enable Unknown-unicast storm control on a physical interface +This command configures unknown-unicast storm-control on a physical interface.
+**switch(config-if)# storm-control unknown-unicast {bps \}** + + +#### 3.5.2.1 Enable Multicast storm control on a physical interface +This command configures unknown-multicast storm-control on physical interface.
+**switch(config-if)# storm-control unknown-multicast {bps \}** + + +### 3.5.3 Show Commands +The following show command displays storm-control configurations. + +**show storm-control [interface \]** + +Following is a sample output + +**show storm-control**
+ +###### Table 3: show storm-control +| Interface | Type | Rate(bps) | +|-----------|------------------|-----------| +| Ethernet0 | broadcast | 1000000 | +| Ethernet0 | unknown-unicast | 2000000 | +| Ethernet2 | unknown-unicast | 5000000 | + +**show storm-control interface Ethernet2**
+ +###### Table 4: show storm-control interface +| Interface | Type | Rate(bps) | +|-----------|------------------|-----------| +| Ethernet2 | unknown-unicast | 5000000 | + +### 3.5.4 Clear Commands +Not applicable +### 3.5.5 Debug Commands +Not applicable +### 3.5.6 REST API Support +REST SET and GET APIs will be supported. + +# 4 Flow Diagrams +## 4.1 Enable storm control on physical interface + +![Storm Control](images/storm_control_enable_on_port.png "Figure 2: Enable storm control on physical interface") + + +__Figure 2: Enable storm control on physical interface__ + + + + + + +## 4.2 Disable storm control on physical interface + + +![Storm Control](images/storm_control_disable_on_port.png "Figure 3: Disable storm control on physical interface") + + +__Figure 3: Disable storm control on physical interface__ + + +## 4.3 Update storm control on physical interface + + +![Storm Control](images/storm_control_update_on_port.png "Figure 4: Update storm control on physical interface") + + +__Figure 4: Update storm control on physical interface__ + + +# 5 Error Handling +# 6 Serviceability and Debug +Debug commands as described in Debug Command section will be supported. Debug command output will be captured as part of tech support. +- A CLI error will be displayed via console and configuration will be rejected +- Internal processing errors within SwSS will be logged in syslog with ERROR level +- SAI interaction errors will be logged in syslog + + +# 7 Warm Boot Support +The storm-control setting on the port should be retained across warmboot so that the BUM storm traffic gets rate-limited as per the configured policer parameters. + + +# 8 Scalability + + +Storm-control is a physical port parameter. Testing would be done by enabling storm-control on all the physical ports. +###### Table 3: Scaling limits +|Name | Scaling value | +|--------------------------|--------------------| +| Number of interfaces | max_physical_ports | + +# 9 Unit Test +## 9.1 CLI Test Cases + + + 1. Configure broadcast storm-control on interface and check that it is updated in CONFIG_DB. + 2. Configure unknown-unicast storm-control on interface and check that it is updated in CONFIG_DB. + 3. Configure unknown-multicast storm-control on interface and check that it is updated in CONFIG_DB. + 4. Unconfigure broadcast storm-control on interface and check that it is updated in CONFIG_DB. + 5. Unconfigure unknown-unicast storm-control on interface and check that it is updated in CONFIG_DB. + 6. Unconfigure unknown-multicast storm-control on interface and check that it is updated in CONFIG_DB. + 7. Execute the show storm-control command to check the configuration. + 8. Verify that the BUM storm-control configurations are correctly re-applied after cold reboot. + 9. Verify that all the three storm-control types can be configured and rate limiting is + applied independently on the three types of traffic received at the interface. + 10. Verify that the bps value configured is independent per interface. + 11. When user configures BUM storm-control on interface where the same type is already configured, + verify that if bps value is different, the new bps value is updated to the CONFIG_DB. + + +## 9.2 Rest API Test Cases + 12. Verify broadcast, unknown-multicast and unknown-unicast can be configured on interface using REST. + 13. Verify broadcast, unknown-multicast and unknown-unicast can be unconfigured on interface using REST. + + +## 9.3 Functional Test Cases + 14. Verify that broadcast traffic gets rate-limited as per broadcast storm-control policer parameters. + 15. Verify that unknown-unicast traffic gets rate-limited as per unknown-unicast storm-control policer parameters. + 16. Verify that multicast traffic gets rate-limited as per multicast storm-control policer parameters. + 17. Configure all three BUM storm-control on interface and verify that the rate-limiting of traffic is as per the + respective policer parameters. + 18. Verify that other traffic streams are unaffected by BUM storm-control configuration. + 19. Verify that after unconfiguring BUM storm-control configuration on interface, BUM storm traffic rate is no + more rate limited. + 20. Verify that traffic is rate-limited as per the updated value of bps when user updates existing + BUM storm-control configuration on interface. + + + +## 9.4 Scaling Test Cases + 21. Configure BUM storm-control on all the physical interfaces on the system and check that rate-limiting is + performed on all interfaces. + +## 9.5 Warm Boot Test Cases + 22. Verify that BUM storm-control configurations are restored after warm boot. + 23. Verify that BUM storm rate-limiting continues to work at the specific rate across warm boot. + 24. Verify that BUM storm-control is only active on interfaces that previously had storm-control configurations + before warm boot. + + +## 9.6 Negative Test Cases + 25. Verify that storm-control configuration errors out when applied on port-channel or vlan interfaces. + 26. Verify that error is returned when the same configuration is repeated on the interface. + 27. Configure BUM storm-control on interface without providing bps value and check that configuration is + not accepted. + 28. Unconfigure BUM storm-control on interface by providing bps as input and check that + additional / invalid parameter error is displayed. + 29. Verify that invalid parameter error is displayed when value of bps is out of range or invalid. + 30. Verify that invalid parameter / input error is displayed when invalid input is provided for storm-control type. + + + + diff --git a/doc/bum_storm_control/images/storm_control_architecture.png b/doc/bum_storm_control/images/storm_control_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..7c5c01747de3ea96fd98166a4c94cb7b33f4834b GIT binary patch literal 21052 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 BK2ZPw literal 0 HcmV?d00001 diff --git a/doc/bum_storm_control/images/storm_control_disable_on_port.png b/doc/bum_storm_control/images/storm_control_disable_on_port.png new file mode 100644 index 0000000000000000000000000000000000000000..6fb6db10b56e69845e0e5b0e258d5447d9847b9a GIT binary patch literal 16127 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 Q6yP63QA43X&g{wm0292@&j0`b literal 0 HcmV?d00001 diff --git a/doc/bum_storm_control/images/storm_control_enable_on_port.png b/doc/bum_storm_control/images/storm_control_enable_on_port.png new file mode 100644 index 0000000000000000000000000000000000000000..683102bf2da2a7a960a2cdd44ddc23eca5f78e0f GIT binary patch literal 16269 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 anIJ-*6sN=ib%4nOX{zg9E4X46`ab|FO&7BO literal 0 HcmV?d00001 diff --git a/doc/bum_storm_control/images/storm_control_update_on_port.png b/doc/bum_storm_control/images/storm_control_update_on_port.png new file mode 100644 index 0000000000000000000000000000000000000000..f305183757da4db935d5d7f0841bb1b1b9067656 GIT binary patch literal 19513 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 Date: Mon, 1 Jun 2020 01:51:29 -0700 Subject: [PATCH 2/6] SONIC broadcast, unknown-unicast and unknown-multicast (BUM) storm-control HLD --- .../bum_storm_control_hld.md | 133 ++++++++---------- 1 file changed, 60 insertions(+), 73 deletions(-) diff --git a/doc/bum_storm_control/bum_storm_control_hld.md b/doc/bum_storm_control/bum_storm_control_hld.md index e3317cd2dc..dedae088a2 100644 --- a/doc/bum_storm_control/bum_storm_control_hld.md +++ b/doc/bum_storm_control/bum_storm_control_hld.md @@ -41,7 +41,6 @@ * [3.5.3 Show Commands](#353-show-commands) * [3.5.4 Clear Commands](#354-clear-commands) * [3.5.5 Debug Commands](#355-debug-commands) - * [3.5.6 Rest API Support](#356-rest-api-support) * [4 Flow Diagrams](#4-flow-diagrams) * [4.1 Enable storm control on physical interface](#41-enable-storm-control-on-phy) * [4.2 Disable storm Control on physical interface](#42-disable-storm-control-on-phy) @@ -52,11 +51,10 @@ * [8 Scalability](#8-scalability) * [9 Unit Test](#9-unit-test) * [9.1 CLI Test Cases](#91-cli-test-cases) - * [9.2 REST API Test Cases](#92-rest-api-test-cases) - * [9.3 Functional Test Cases](#93-functional-test-cases) - * [9.4 Scaling Test Cases](#94-scaling-test-cases) - * [9.5 Warm Boot Test Cases](#95-warm-boot-test-cases) - * [9.6 Negative Test Cases](#96-negative-test-cases) + * [9.2 Functional Test Cases](#92-functional-test-cases) + * [9.3 Scaling Test Cases](#93-scaling-test-cases) + * [9.4 Warm Boot Test Cases](#94-warm-boot-test-cases) + * [9.5 Negative Test Cases](#95-negative-test-cases) # List of Tables @@ -87,7 +85,7 @@ This document describes the functionality and high level design of Broadcast, Un # 1 Feature Overview A traffic storm occurs when packets flood the LAN, creating excessive traffic and degrading network performance. The type of traffic can be Broadcast, Unknown-unicast or unknown-Multicast (BUM). -The storm-control feature allows the user to limit the amount of BUM traffic admitted to the system. This can be achieved by configuring the type of storm (Broadcast or Unknown-unicast or unknown-Multicast) and the corresponding bits per second (bps) parameter on a given physical interface. Traffic that exceeds the configured rate will be dropped. +The storm-control feature allows the user to limit the amount of BUM traffic admitted to the system. This can be achieved by configuring the type of storm (Broadcast or Unknown-unicast or unknown-Multicast) and the corresponding kilo bits per second (kbps) parameter on a given physical interface. Traffic that exceeds the configured rate will be dropped. Unknown-multicast traffic consists of all multicast traffic which donot match any of the statically configured or dynamically learned multicast groups. @@ -97,14 +95,13 @@ Unknown-multicast traffic consists of all multicast traffic which donot match an ### 1.1.1 Functional Requirements 1. Support configuration of Broadcast, Unknown-unicast and unknown-Multicast storm-control independently on physical interfaces. - 2. Support threshold rate configuration in bits per second (bps) in the range of 0 bps to 100Gbps. + 2. Support threshold rate configuration in kilo bits per second (kbps) in the range of 0 kbps to 100,000,000 kbps (100Gbps). ### 1.1.2 Configuration and Management Requirements -This feature will support SONiC CLI. +This feature will support Click CLI. 1. Support a CLI to add or delete broadcast, unknown-unicast and unknown-multicast storm-control on a physical interface as described in "Configuration Commands" section below. 2. Support show commands to display the storm-control configuration as described in "Show Commands" section below. 3. Support debug commands as described in "Debug Commands" section below. - 4. Support openconfig REST API and gNMI. ### 1.1.3 Scalability Requirements @@ -146,8 +143,9 @@ Refer to section 1.1 ## 2.3 Limitations BUM storm control -- Configuration is not supported on VLAN and port-channel interfaces. +- Configuration is not supported on VLAN and port-channel interfaces. User can configure on physical port which is part of a VLAN / port-channel. - Statistics is not supported. +- REST, gNMI and Klish CLI are not supported. @@ -161,7 +159,7 @@ BUM storm control __Figure 1: Storm Control High Level Architecture__ 1) Storm-control configurations are parsed and stored in CFG_PORT_STORM_CONTROL_TABLE in Configuration database by the Management Framework. -2) The Policer Orchestration Agent subscribes to notifications from the CFG_PORT_STORM_CONTROL_TABLE and parses the input parameters (interface, storm-control type, bps). A policer_name is created internally by encoding the interface_name and storm_control_type. +2) The Policer Orchestration Agent subscribes to notifications from the CFG_PORT_STORM_CONTROL_TABLE and parses the input parameters (interface, storm-control type, kbps). A policer_name is created internally by encoding the interface_name and storm_control_type. 3) create_policer SAI API is invoked to create a policer with the given input parameters. 4) The identifier of the policer created is associated with the encoded policer_name. 5) The policer identifier is passed to set_port_attribute SAI API to set the appropriate type of storm-control on the port. @@ -181,7 +179,7 @@ A new table CFG_PORT_STORM_CONTROL_TABLE is introduced in the configuration data key = CFG_PORT_STORM_CONTROL_TABLE:port:storm_control_type ; Ethernet Interface Name and storm control type ;field = value enabled = BIT ; Is the storm control enabled (1) or disabled (0) on the interface - bps = 1*13 DIGIT ; CIR value in bits per second + kbps = 1*13 DIGIT ; CIR value in kilo bits per second ### 3.2.2 APP_DB No tables are introduced in APP_DB @@ -223,7 +221,7 @@ The BUM storm-control feature can be enabled on a physical port. The **create_policer** SAI API is used to create the policer based on the policer parameters listed in Table 2. - Meter Type - Can be packets or bytes. Storm-control uses bytes meter type. - Meter Mode - Can be st_tcm or tr_tcm or storm. Storm-control uses storm meter mode. - - CIR (bps) - Value of CIR configured in bps. + - CIR (bps) - Value of CIR given in bps. The **set_port_attribute** SAI API is used to set the policer on an interface. - Unknown-unicast policer - Enables storm-control for unknown-unicast traffic received on the interface. @@ -232,60 +230,64 @@ The **set_port_attribute** SAI API is used to set the policer on an interface. ## 3.5 CLI ### 3.5.1 Data Models -Custom Yang model will be introduced for this feature. +Configuration is supported using Click CLI commands. ### 3.5.2 Configuration Commands BUM storm-control can be configured only on physical interfaces. -**switch# configure terminal**
-**switch(config)# interface Ethernet **
-**switch(config-if)# storm-control {broadcast | unknown-unicast | unknown-multicast} {bps \}** +**switch# config interface storm-control {broadcast | unknown-unicast | unknown-multicast} {add|del} \ {\}** #### 3.5.2.1 Enable Broadcast storm control on a physical interface This command configures broadcast storm-control on a physical interface.
-**switch(config-if)# storm-control broadcast {bps \}** +**switch# config interface storm-control broadcast add \ {\}** #### 3.5.2.1 Enable Unknown-unicast storm control on a physical interface This command configures unknown-unicast storm-control on a physical interface.
-**switch(config-if)# storm-control unknown-unicast {bps \}** +**switch# config interface storm-control unknown-unicast add \ {\}** #### 3.5.2.1 Enable Multicast storm control on a physical interface This command configures unknown-multicast storm-control on physical interface.
-**switch(config-if)# storm-control unknown-multicast {bps \}** +**switch# config interface storm-control unknown-multicast add \ {\}** ### 3.5.3 Show Commands The following show command displays storm-control configurations. -**show storm-control [interface \]** +**show storm-control {all | interface \}** Following is a sample output -**show storm-control**
+**show storm-control all**
###### Table 3: show storm-control -| Interface | Type | Rate(bps) | -|-----------|------------------|-----------| -| Ethernet0 | broadcast | 1000000 | -| Ethernet0 | unknown-unicast | 2000000 | -| Ethernet2 | unknown-unicast | 5000000 | ++------------------+-----------------+---------------+ +| Interface Name | Storm Type | Rate (kbps) | ++==================+=================+===============+ +| Ethernet0 | broadcast | 1000 | ++------------------+-----------------+---------------+ +| Ethernet0 | unknown-unicast | 2000 | ++------------------+-----------------+---------------+ +| Ethernet2 | unknown-unicast | 5000 | ++------------------+-----------------+---------------+ + **show storm-control interface Ethernet2**
###### Table 4: show storm-control interface -| Interface | Type | Rate(bps) | -|-----------|------------------|-----------| -| Ethernet2 | unknown-unicast | 5000000 | - ++------------------+-----------------+---------------+ +| Interface Name | Storm Type | Rate (kbps) | ++==================+=================+===============+ +| Ethernet2 | unknown-unicast | 5000 | ++------------------+-----------------+---------------+ + + ### 3.5.4 Clear Commands Not applicable ### 3.5.5 Debug Commands Not applicable -### 3.5.6 REST API Support -REST SET and GET APIs will be supported. # 4 Flow Diagrams ## 4.1 Enable storm control on physical interface @@ -353,59 +355,44 @@ Storm-control is a physical port parameter. Testing would be done by enabling st 8. Verify that the BUM storm-control configurations are correctly re-applied after cold reboot. 9. Verify that all the three storm-control types can be configured and rate limiting is applied independently on the three types of traffic received at the interface. - 10. Verify that the bps value configured is independent per interface. + 10. Verify that the kbps value configured is independent per interface. 11. When user configures BUM storm-control on interface where the same type is already configured, - verify that if bps value is different, the new bps value is updated to the CONFIG_DB. + verify that if kbps value is different, the new kbps value is updated to the CONFIG_DB. -## 9.2 Rest API Test Cases - 12. Verify broadcast, unknown-multicast and unknown-unicast can be configured on interface using REST. - 13. Verify broadcast, unknown-multicast and unknown-unicast can be unconfigured on interface using REST. - - -## 9.3 Functional Test Cases - 14. Verify that broadcast traffic gets rate-limited as per broadcast storm-control policer parameters. - 15. Verify that unknown-unicast traffic gets rate-limited as per unknown-unicast storm-control policer parameters. - 16. Verify that multicast traffic gets rate-limited as per multicast storm-control policer parameters. - 17. Configure all three BUM storm-control on interface and verify that the rate-limiting of traffic is as per the +## 9.2 Functional Test Cases + 12. Verify that broadcast traffic gets rate-limited as per broadcast storm-control policer parameters. + 13. Verify that unknown-unicast traffic gets rate-limited as per unknown-unicast storm-control policer parameters. + 14. Verify that multicast traffic gets rate-limited as per multicast storm-control policer parameters. + 15. Configure all three BUM storm-control on interface and verify that the rate-limiting of traffic is as per the respective policer parameters. - 18. Verify that other traffic streams are unaffected by BUM storm-control configuration. - 19. Verify that after unconfiguring BUM storm-control configuration on interface, BUM storm traffic rate is no + 16. Verify that other traffic streams are unaffected by BUM storm-control configuration. + 17. Verify that after unconfiguring BUM storm-control configuration on interface, BUM storm traffic rate is no more rate limited. - 20. Verify that traffic is rate-limited as per the updated value of bps when user updates existing + 18. Verify that traffic is rate-limited as per the updated value of kbps when user updates existing BUM storm-control configuration on interface. -## 9.4 Scaling Test Cases - 21. Configure BUM storm-control on all the physical interfaces on the system and check that rate-limiting is +## 9.3 Scaling Test Cases + 19. Configure BUM storm-control on all the physical interfaces on the system and check that rate-limiting is performed on all interfaces. -## 9.5 Warm Boot Test Cases - 22. Verify that BUM storm-control configurations are restored after warm boot. - 23. Verify that BUM storm rate-limiting continues to work at the specific rate across warm boot. - 24. Verify that BUM storm-control is only active on interfaces that previously had storm-control configurations +## 9.4 Warm Boot Test Cases + 20. Verify that BUM storm-control configurations are restored after warm boot. + 21. Verify that BUM storm rate-limiting continues to work at the specific rate across warm boot. + 22. Verify that BUM storm-control is only active on interfaces that previously had storm-control configurations before warm boot. -## 9.6 Negative Test Cases - 25. Verify that storm-control configuration errors out when applied on port-channel or vlan interfaces. - 26. Verify that error is returned when the same configuration is repeated on the interface. - 27. Configure BUM storm-control on interface without providing bps value and check that configuration is +## 9.5 Negative Test Cases + 23. Verify that storm-control configuration errors out when applied on port-channel or vlan interfaces. + 24. Verify that error is returned when the same configuration is repeated on the interface. + 25. Configure BUM storm-control on interface without providing kbps value and check that configuration is not accepted. - 28. Unconfigure BUM storm-control on interface by providing bps as input and check that + 26. Unconfigure BUM storm-control on interface by providing kbps as input and check that additional / invalid parameter error is displayed. - 29. Verify that invalid parameter error is displayed when value of bps is out of range or invalid. - 30. Verify that invalid parameter / input error is displayed when invalid input is provided for storm-control type. - - - + 27. Verify that invalid parameter error is displayed when value of kbps is out of range or invalid. + 28. Verify that invalid parameter / input error is displayed when invalid input is provided for storm-control type. + From 453ca2acb11ef551cd7b859705f7bf6234ad9b5f Mon Sep 17 00:00:00 2001 From: Mohanarajan Selvaraj Date: Mon, 19 Apr 2021 04:32:42 -0700 Subject: [PATCH 3/6] Updated few of the comments based on HLD review --- .../bum_storm_control_hld.md | 7 ++++--- .../images/storm_control_update_on_port.png | Bin 19513 -> 31154 bytes 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/bum_storm_control/bum_storm_control_hld.md b/doc/bum_storm_control/bum_storm_control_hld.md index dedae088a2..13ee2d28df 100644 --- a/doc/bum_storm_control/bum_storm_control_hld.md +++ b/doc/bum_storm_control/bum_storm_control_hld.md @@ -98,7 +98,7 @@ Unknown-multicast traffic consists of all multicast traffic which donot match an 2. Support threshold rate configuration in kilo bits per second (kbps) in the range of 0 kbps to 100,000,000 kbps (100Gbps). ### 1.1.2 Configuration and Management Requirements -This feature will support Click CLI. +This feature supports Click, Klish, REST, gNMI interfaces. 1. Support a CLI to add or delete broadcast, unknown-unicast and unknown-multicast storm-control on a physical interface as described in "Configuration Commands" section below. 2. Support show commands to display the storm-control configuration as described in "Show Commands" section below. 3. Support debug commands as described in "Debug Commands" section below. @@ -145,7 +145,7 @@ Refer to section 1.1 BUM storm control - Configuration is not supported on VLAN and port-channel interfaces. User can configure on physical port which is part of a VLAN / port-channel. - Statistics is not supported. -- REST, gNMI and Klish CLI are not supported. +- User is expected to remove all storm-control configurations from interface before doing a breakout from Click CLI. @@ -230,10 +230,11 @@ The **set_port_attribute** SAI API is used to set the policer on an interface. ## 3.5 CLI ### 3.5.1 Data Models -Configuration is supported using Click CLI commands. +Configuration is supported using Click and Klish CLI commands. ### 3.5.2 Configuration Commands +This section lists down the Click commands. BUM storm-control can be configured only on physical interfaces. **switch# config interface storm-control {broadcast | unknown-unicast | unknown-multicast} {add|del} \ {\}** diff --git a/doc/bum_storm_control/images/storm_control_update_on_port.png b/doc/bum_storm_control/images/storm_control_update_on_port.png index f305183757da4db935d5d7f0841bb1b1b9067656..2007ddb89b8dd93976cfaed82d62eab040b1490a 100644 GIT binary patch literal 31154 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

!LHfq_lxH-^WQ8L!j0|(Xr>(A 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 Bid6sr literal 19513 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 Date: Mon, 2 Aug 2021 05:33:52 -0700 Subject: [PATCH 4/6] update config DB table name and key separator --- doc/bum_storm_control/bum_storm_control_hld.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/bum_storm_control/bum_storm_control_hld.md b/doc/bum_storm_control/bum_storm_control_hld.md index 13ee2d28df..c320491add 100644 --- a/doc/bum_storm_control/bum_storm_control_hld.md +++ b/doc/bum_storm_control/bum_storm_control_hld.md @@ -158,8 +158,8 @@ BUM storm control __Figure 1: Storm Control High Level Architecture__ -1) Storm-control configurations are parsed and stored in CFG_PORT_STORM_CONTROL_TABLE in Configuration database by the Management Framework. -2) The Policer Orchestration Agent subscribes to notifications from the CFG_PORT_STORM_CONTROL_TABLE and parses the input parameters (interface, storm-control type, kbps). A policer_name is created internally by encoding the interface_name and storm_control_type. +1) Storm-control configurations are parsed and stored in PORT_STORM_CONTROL in Configuration database by the Management Framework. +2) The Policer Orchestration Agent subscribes to notifications from the PORT_STORM_CONTROL and parses the input parameters (interface, storm-control type, kbps). A policer_name is created internally by encoding the interface_name and storm_control_type. 3) create_policer SAI API is invoked to create a policer with the given input parameters. 4) The identifier of the policer created is associated with the encoded policer_name. 5) The policer identifier is passed to set_port_attribute SAI API to set the appropriate type of storm-control on the port. @@ -170,13 +170,13 @@ This section describes the changes made to different DBs for supporting storm-co ### 3.2.1 CONFIG_DB -A new table CFG_PORT_STORM_CONTROL_TABLE is introduced in the configuration database for the purpose of storing storm-control configuration parameters. This table is filled by the management framework. -#### CFG_PORT_STORM_CONTROL_TABLE +A new table PORT_STORM_CONTROL is introduced in the configuration database for the purpose of storing storm-control configuration parameters. This table is filled by the management framework. +#### PORT_STORM_CONTROL ;Store Storm Control configuration per physical port ;Status: work in progress ;storm control type - broadcast / unknown-unicast / unknown-multicast - key = CFG_PORT_STORM_CONTROL_TABLE:port:storm_control_type ; Ethernet Interface Name and storm control type + key = PORT_STORM_CONTROL:port|storm_control_type ; Ethernet Interface Name and storm control type ;field = value enabled = BIT ; Is the storm control enabled (1) or disabled (0) on the interface kbps = 1*13 DIGIT ; CIR value in kilo bits per second @@ -195,7 +195,7 @@ No changes are introduced in COUNTER_DB. ## 3.3 Switch State Service Design ### 3.3.1 PolicerOrch changes Policer Orchestration agent is responsible for the following activities: - - Subscribes to notifications on CFG_PORT_STORM_CONTROL_TABLE entries in the CONFIG_DB. + - Subscribes to notifications on PORT_STORM_CONTROL entries in the CONFIG_DB. - Creates an internal name for policer by encoding the interface name and storm-control type. - Creates the policer based on the parameters and associates the policer identifier to internal name - Populates the port attribute SAI structures and pushes the entry to ASIC_DB. From 7f22539a7967330e8e14450e43bffe1bbc57b1db Mon Sep 17 00:00:00 2001 From: Mohanarajan Selvaraj Date: Mon, 2 Aug 2021 06:03:53 -0700 Subject: [PATCH 5/6] Update revision number and date, supported configuration modes --- doc/bum_storm_control/bum_storm_control_hld.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/bum_storm_control/bum_storm_control_hld.md b/doc/bum_storm_control/bum_storm_control_hld.md index c320491add..73b107700d 100644 --- a/doc/bum_storm_control/bum_storm_control_hld.md +++ b/doc/bum_storm_control/bum_storm_control_hld.md @@ -66,6 +66,7 @@ | Rev | Date | Author | Change Description | |:---:|:-----------:|:------------------:|-----------------------------------| | 0.1 | 06/24/2019 | Mohanarajan Selvaraj| Initial version | +| 1.0 | 08/01/2021 | Mohanarajan Selvaraj| Config DB Table update | # About this Manual @@ -98,7 +99,7 @@ Unknown-multicast traffic consists of all multicast traffic which donot match an 2. Support threshold rate configuration in kilo bits per second (kbps) in the range of 0 kbps to 100,000,000 kbps (100Gbps). ### 1.1.2 Configuration and Management Requirements -This feature supports Click, Klish, REST, gNMI interfaces. +This feature supports ,SONiC yang, SONiC CLI and mgmt framework interfaces(Klish, REST, gNMI). 1. Support a CLI to add or delete broadcast, unknown-unicast and unknown-multicast storm-control on a physical interface as described in "Configuration Commands" section below. 2. Support show commands to display the storm-control configuration as described in "Show Commands" section below. 3. Support debug commands as described in "Debug Commands" section below. @@ -158,7 +159,7 @@ BUM storm control __Figure 1: Storm Control High Level Architecture__ -1) Storm-control configurations are parsed and stored in PORT_STORM_CONTROL in Configuration database by the Management Framework. +1) Storm-control configurations are done using SONiC yang / SONiC CLI / management framework. The configurations are parsed and stored in PORT_STORM_CONTROL Table in Configuration database. 2) The Policer Orchestration Agent subscribes to notifications from the PORT_STORM_CONTROL and parses the input parameters (interface, storm-control type, kbps). A policer_name is created internally by encoding the interface_name and storm_control_type. 3) create_policer SAI API is invoked to create a policer with the given input parameters. 4) The identifier of the policer created is associated with the encoded policer_name. From 11d5eb5db82a418128dfc2b6c42503e41ca88f4a Mon Sep 17 00:00:00 2001 From: Mohanarajan Selvaraj Date: Wed, 3 Nov 2021 13:17:03 -0700 Subject: [PATCH 6/6] Updated statement on breakout handling. Minor correction. --- doc/bum_storm_control/bum_storm_control_hld.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/doc/bum_storm_control/bum_storm_control_hld.md b/doc/bum_storm_control/bum_storm_control_hld.md index 73b107700d..3eff194313 100644 --- a/doc/bum_storm_control/bum_storm_control_hld.md +++ b/doc/bum_storm_control/bum_storm_control_hld.md @@ -99,7 +99,7 @@ Unknown-multicast traffic consists of all multicast traffic which donot match an 2. Support threshold rate configuration in kilo bits per second (kbps) in the range of 0 kbps to 100,000,000 kbps (100Gbps). ### 1.1.2 Configuration and Management Requirements -This feature supports ,SONiC yang, SONiC CLI and mgmt framework interfaces(Klish, REST, gNMI). +This feature supports SONiC yang, SONiC CLI and mgmt framework interfaces(Klish, REST, gNMI). 1. Support a CLI to add or delete broadcast, unknown-unicast and unknown-multicast storm-control on a physical interface as described in "Configuration Commands" section below. 2. Support show commands to display the storm-control configuration as described in "Show Commands" section below. 3. Support debug commands as described in "Debug Commands" section below. @@ -146,8 +146,6 @@ Refer to section 1.1 BUM storm control - Configuration is not supported on VLAN and port-channel interfaces. User can configure on physical port which is part of a VLAN / port-channel. - Statistics is not supported. -- User is expected to remove all storm-control configurations from interface before doing a breakout from Click CLI. - # 3 Design