From a2550dbd0e5c7c02dcec6914b158b3f61faca7ae Mon Sep 17 00:00:00 2001 From: shiraez Date: Mon, 30 Sep 2024 09:33:36 +0300 Subject: [PATCH 1/3] Policer Counter - HLD --- doc/policer_counter/PolicerCounter-HLD.md | 297 ++++++++++++++++++ doc/policer_counter/img/policer-arch.png | Bin 0 -> 37235 bytes .../img/policer-flow-add-counter.png | Bin 0 -> 43278 bytes .../img/policer-flow-remove-counter.png | Bin 0 -> 28490 bytes 4 files changed, 297 insertions(+) create mode 100755 doc/policer_counter/PolicerCounter-HLD.md create mode 100755 doc/policer_counter/img/policer-arch.png create mode 100755 doc/policer_counter/img/policer-flow-add-counter.png create mode 100755 doc/policer_counter/img/policer-flow-remove-counter.png diff --git a/doc/policer_counter/PolicerCounter-HLD.md b/doc/policer_counter/PolicerCounter-HLD.md new file mode 100755 index 0000000000..1abe5dde38 --- /dev/null +++ b/doc/policer_counter/PolicerCounter-HLD.md @@ -0,0 +1,297 @@ +# POLICER Counters Support # + +## Table of Content +* [Revision](#revision) +* [Scope](#scope) +* [Defintions/Abbreviation](#definitionsabbreviation) +* [Overview](#overview) +* [Requirements](#requirements) +* [Architecture Design](#Architecture-Design) + - [High-Level Design](#High-Level-Design) + - [Orchagent](#orchagent) + - [Syncd](#syncd) + - [SAI APIs](#sai-apis) + - [Counters DB](#counters-db) + - [CLI](#cli) + - [Flows](#flows) + - [POLICER counter registration in FC](#policer-counter-registration-in-FC) + - [POLICER counter de-registration in FC](#policer-counter-de-registration-in-FC) +- [Configuration and management](#configuration-management) + - [CLI/YANG model Enhancements](#cli-yang) + - [Config DB Enhancements](#config-db) +- [Warmboot and Fastboot Design Impact](#warmboot-fastboot) +- [Restrictions/Limitations](#restrictions-limitations) +- [Testing Requirements/Design](#testing) + - [Unit Test cases](#unit-test) + - [System Test cases](#system-test) +- [Open/Action items](#open-item) + +### Revision + +| Rev | Date | Author | Change Description | +|:---:|:-----------:|:------------------:|-----------------------------------| +| 0.1 | | Shira Ezra | Initial version | + +### Scope + +This document provides general information about Policer counter feature in SONiC. + +### Definitions/Abbreviations + +| Definitions/Abbreviation | Description | +|--------------------------|--------------------------------------------| +| API | Application Programmable Interface | +| FC | Flex Counter | +| VID | SAIRedis Virtual object identifier | +| SAI | Switch Abstraction Interface | + +### Overview + +Policer Counters provides a simple and scalable approach for monitoring and analyzing traffic policing statistics. +This design leverages the existing FC infrastructure, to efficiently collect, process, and store policer statistics such as total packets/bytes and color-based (green/yellow/red) packet/byte counts. By offering real-time visibility into traffic patterns and policy enforcement, this feature enhances network management capabilities, facilitates troubleshooting, and enables fine-tuning of network policies. + +### Requirements + +- Support for configuring and managing policer counters through the Flex Counter infrastructure. +- Ability to retrieve policer counter values, including green, yellow, and red packet/byte counters. +- Integration with the existing SONiC Flex Counter configuration and management interfaces. +- Compatibility with the SAI for platform-independent implementation. +- Using the exsiting ```counterpoll``` CLI command we are adding support for enabling and disabling polling, and changing polling interval, based on user configuration. + +### Architecture Design + +No SONiC architecture changes are required as an existing flex counter infrastructure is being used. + +### High-Level Design + +

+Figure 1. Policer Architecture +

+ +### SAI + +The attributes that are being queried: + +| SAI Attribute | Description +|------------------------------|----------------------| +| SAI_POLICER_STAT_PACKETS | Get/set packet count | +| SAI_POLICER_STAT_ATTR_BYTES | Get/set byte count | +| SAI_POLICER_STAT_GREEN_PACKETS | Get/set green packet count | +| SAI_POLICER_STAT_GREEN_BYTES | Get/set green byte count | +| SAI_POLICER_STAT_YELLOW_PACKETS | Get/set yellow packet count | +| SAI_POLICER_STAT_YELLOW_BYTES | Get/set yellow byte count | +| SAI_POLICER_STAT_RED_PACKETS | Get/set red packet count | +| SAI_POLICER_STAT_RED_PACKETS | Get/set red byte count | + +### Orchagent + +A new type of FC has been added to flex_counter/flex_counter_manager.h for its corresponding SAI object, along with a new FC group named "POLICER": + +Counter Type: +```c++ +CounterType::POLICER +``` + +PolicerOrch holds a new object of type FlexCounterManager and is initialized with ```StatsMode::READ``` +and a default polling interval of 10 sec and enabled by default: +```c++ +FlexCounterManager m_pc_manager; +``` + +#### Additionally, the following mapping should be added: +- "COUNTERS_POLICER_NAME_MAP" - maps the POLICER oid to its name + +### Syncd + +Added POLICER FC group support in syncd/FlexCounter.cpp. + +### SAI API + +No new SAI API is used. + +### COUNTERS DB + +Counters table in COUNTERS DB: + +- "COUNTERS:oid:" + - key: SAI_POLICER_STAT_PACKETS + - value: Get packet count [uint64_t] + - key: SAI_POLICER_STAT_ATTR_BYTES + - value: Get byte count [uint64_t] + - key: SAI_POLICER_STAT_GREEN_PACKETS + - value: Get green packet count [uint64_t] + - key: SAI_POLICER_STAT_GREEN_BYTES + - value: Get green byte count [uint64_t] + - key: SAI_POLICER_STAT_YELLOW_PACKETS + - value: Get yellow packet count [uint64_t] + - key: SAI_POLICER_STAT_YELLOW_BYTES + - value: Get yellow byte count [uint64_t] + - key: SAI_POLICER_STAT_RED_PACKETS + - value: Get red packet count [uint64_t] + - key: SAI_POLICER_STAT_RED_BYTES + - value: Get red byte count [uint64_t] + +``` +127.0.0.1:6379[2]> hgetall COUNTERS:oid:0x100000000037a +1) "SAI_POLICER_STAT_PACKETS" +2) "1000" +3) "SAI_POLICER_STAT_ATTR_BYTES" +4) "102400" +5) "SAI_POLICER_STAT_GREEN_PACKETS" +6) "600" +7) "SAI_POLICER_STAT_GREEN_BYTES" +8) "61440" +9) "SAI_POLICER_STAT_YELLOW_PACKETS" +10) "300" +11) "SAI_POLICER_STAT_YELLOW_BYTES" +12) "30720" +13) "SAI_POLICER_STAT_RED_PACKETS" +14) "100" +15) "SAI_POLICER_STAT_RED_BYTES" +16) "10240" +``` + +Mapping hash table in COUNTERS_DB: + +- "COUNTERS_POLICER_NAME_MAP" + - key: POLICER name (e.g: "span_policer") + - value: VID of the POLICER counter + +E.g: + +``` +127.0.0.1:6379[2]> hgetall COUNTERS_POLICER_NAME_MAP + 1) "span_policer" + 2) "oid:0x100000000037a" +``` + +### CLI + +*policerstat* utility is added to reads counters from the COUNTERS DB using the POLICER table in CONFIG DB and the COUNTERS_POLICER_NAME_MAP. It maps each POLICER to its VID and fetches counter values. If a map entry or VID is missing, it shows N/A, indicating either the POLICER was created without a counter, the policer/map entry isn't created yet, polling is disabled, or syncd hasn't updated the COUNTERS DB. + +``` +admin@sonic:~$ policerstat + Name Green Packets Green Bytes Yellow Packets Yellow Bytes Red Packets Red Bytes +------- --------------- ------------- ---------------- --------------- ------------- ------------ +span_policer 600 61440 300 30720 100 10240 + +``` + +Added a new CLI command +``` +show policer counter +clear policer counter +``` +### Flows + +### POLICER counter registration in FC +

+Figure 2. Policer counter registration flow +

+ + +### POLICER counter de-registration in FC +

+Figure 3. Policer counter de-registration flow +

+ + +### Configuration and management +#### CLI/YANG model Enhancements +#### Config DB Enhancements + +Enable POLICER counter polling: +``` +admin@sonic:~$ counterpoll policer enable +``` + +Disable POLICER counter polling (NOTE: POLICER counter objects are still configured in HW): +``` +admin@sonic:~$ counterpoll policer disable +``` + +Set POLICER counter polling interval: +``` +admin@sonic:~$ counterpoll policer interval [INTERVAL IN MS] +``` + +Config DB schema with POLICER key in FLEX COUNTER table: + +```json +{ + "FLEX_COUNTER_TABLE": { + "POLICER": { + "FLEX_COUNTER_STATUS": "enable", + "POLL_INTERVAL": "10000" + } + } +} +``` + +Flex Counter YANG model with POLICER group: + +```yang + container POLICER { + /* POLICER_FLEX_COUNTER_GROUP */ + leaf FLEX_COUNTER_STATUS { + type flex_status; + } + leaf FLEX_COUNTER_DELAY_STATUS { + type flex_delay_status; + } + leaf POLL_INTERVAL { + type poll_interval; + } + } +``` + +### Warmboot and Fastboot Design Impact + +Counter polling is delayed at system startup. + +### Restrictions/Limitations +N/A + +### Testing Requirements/Design + +#### Unit Test cases + +##### sonic-utilities + +CLI Level Tests: + +1. TestCounterpoll::test_update_policer_counter_status (Add new case for `counterpoll policer `) + - Verify command run successfully with valid parameter enable/disable + - Verify CONFIG DB is correctly updated + +2. TestCounterpoll::test_update_policer_counter_interval (Add new case for `counterpoll policer interval `) + - Verify command run successfully with valid parameter (interval value in allowed range) + - Verify CONFIG DB is correctly updated + - Verify command abort with invalid parameter + +3. TestCounterpoll::test_show (Extend existing case for `counterpoll show`) + - Verify new counter group is in the output + +4. TestPolicerStat::show_pattern (Add new case for `policerstats`) + - Verify command output with normal format + - Verify command output with JSON format + +5. TestPolicerStat::show_policer (Add new case for `show policer counter `) + - Verify command output with normal format + - Verify command output with JSON format + +6. TestPolicerStat::clear_policer (Add new case for `clear policer counter `) + - Verify stats value can be cleared + + +##### sonic-swss + +Functional Tests: + + +#### System Test cases + +- POLICER tests suite in sonic-mgmt covers the POLICER counter functionality. +- Warm/Fast reboot tests to check the changes do not break these features. + + diff --git a/doc/policer_counter/img/policer-arch.png b/doc/policer_counter/img/policer-arch.png new file mode 100755 index 0000000000000000000000000000000000000000..7cab47fc82990853f597e88cc00a160f885a6675 GIT binary patch literal 37235 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 W2-$tME@$o_;AL)XV^n6~5&J(kGbMQd literal 0 HcmV?d00001 diff --git a/doc/policer_counter/img/policer-flow-remove-counter.png b/doc/policer_counter/img/policer-flow-remove-counter.png new file mode 100755 index 0000000000000000000000000000000000000000..a1ba17c668c4e1d2aa7b13fabb5037eb6b7f1282 GIT binary patch literal 28490 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 S!2cW%GrQ0C2h9{&d@?^@OX literal 0 HcmV?d00001 From d826e7bb005599c9137a6124f6db43a0423244ed Mon Sep 17 00:00:00 2001 From: shiraez Date: Mon, 30 Sep 2024 10:34:33 +0300 Subject: [PATCH 2/3] Flows --- doc/policer_counter/PolicerCounter-HLD.md | 25 +++++++++++------------ 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/doc/policer_counter/PolicerCounter-HLD.md b/doc/policer_counter/PolicerCounter-HLD.md index 1abe5dde38..f5e63221c1 100755 --- a/doc/policer_counter/PolicerCounter-HLD.md +++ b/doc/policer_counter/PolicerCounter-HLD.md @@ -164,6 +164,18 @@ E.g: 1) "span_policer" 2) "oid:0x100000000037a" ``` +### Flows + +### POLICER counter registration in FC +

+Figure 2. Policer counter registration flow +

+ + +### POLICER counter de-registration in FC +

+Figure 3. Policer counter de-registration flow +

### CLI @@ -182,19 +194,6 @@ Added a new CLI command show policer counter clear policer counter ``` -### Flows - -### POLICER counter registration in FC -

-Figure 2. Policer counter registration flow -

- - -### POLICER counter de-registration in FC -

-Figure 3. Policer counter de-registration flow -

- ### Configuration and management #### CLI/YANG model Enhancements From e3f439dcfe2857540a02e4449fce247d4167b621 Mon Sep 17 00:00:00 2001 From: shiraez Date: Tue, 8 Oct 2024 12:29:38 +0300 Subject: [PATCH 3/3] Change policer coiunter default to disable --- doc/policer_counter/PolicerCounter-HLD.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/policer_counter/PolicerCounter-HLD.md b/doc/policer_counter/PolicerCounter-HLD.md index f5e63221c1..fcf26feb61 100755 --- a/doc/policer_counter/PolicerCounter-HLD.md +++ b/doc/policer_counter/PolicerCounter-HLD.md @@ -93,12 +93,12 @@ CounterType::POLICER ``` PolicerOrch holds a new object of type FlexCounterManager and is initialized with ```StatsMode::READ``` -and a default polling interval of 10 sec and enabled by default: +and a default polling interval of 10 sec and disable by default: ```c++ FlexCounterManager m_pc_manager; ``` -#### Additionally, the following mapping should be added: +#### Additionally, the following mapping should be added for the CLI: - "COUNTERS_POLICER_NAME_MAP" - maps the POLICER oid to its name ### Syncd