From b0aa5e3956ca359f0f3fa59a4ee863c0ee45a813 Mon Sep 17 00:00:00 2001 From: Shyam <69485234+shyam77git@users.noreply.github.com> Date: Wed, 16 Feb 2022 20:23:06 -0800 Subject: [PATCH 01/60] Update Interface-Link-bring-up-sequence.md Updated feature-enablement workflow --- doc/sfp-cmis/Interface-Link-bring-up-sequence.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/doc/sfp-cmis/Interface-Link-bring-up-sequence.md b/doc/sfp-cmis/Interface-Link-bring-up-sequence.md index aef8958462..f6c49c69e3 100644 --- a/doc/sfp-cmis/Interface-Link-bring-up-sequence.md +++ b/doc/sfp-cmis/Interface-Link-bring-up-sequence.md @@ -23,8 +23,8 @@ Deterministic Approach for Interface Link bring-up sequence * [Table 2: References](#table-2-references) # Revision -| Rev | Date | Author | Change Description | -|:---:|:-----------:|:----------------------------------:|-----------------------------------| +| Rev | Date | Author | Change Description | +|:---:|:-----------:|:----------------------------------:|-------------------------------------| | 0.1 | 08/16/2021 | Shyam Kumar | Initial version | 0.2 | 12/13/2021 | Shyam Kumar, Jaganathan Anbalagan | Added uses-cases, workflows | 0.3 | 01/19/2022 | Shyam Kumar, Jaganathan Anbalagan | Addressed review-comments @@ -32,6 +32,7 @@ Deterministic Approach for Interface Link bring-up sequence | 0.5 | 01/28/2022 | Shyam Kumar, Jaganathan Anbalagan | Addressed further review-comments | 0.6 | 02/02/2022 | Shyam Kumar | Added feature-enablement workflow | 0.7 | 02/02/2022 | Jaganathan Anbalagan | Added Breakout Handling +| 0.8 | 02/16/2022 | Shyam Kumar | Updated feature-enablement workflow # About this Manual @@ -149,11 +150,14 @@ Please refer to the flow/sequence diagrams which covers the following required # Feature enablement This feature (optics Interface Link bring-up sequence) would be enabled on per platform basis. There could be cases where vendor(s)/platform(s) may take time to shift from existing codebase to the model (work-flows) described in this document. - In order to avoid any breakage and ensure gradual migration of different platforms/vendors to this model, there would be new field (flag) in xcvrd to enable/disable this feature. - When xcvrd spawns on LC/board, it would invoke platform plugin to check with the platform (hwsku) whether this feature is yet supported on underlying platform (board/LC) or not + In order to avoid any breakage and ensure gradual migration of different platforms/vendors to this model, will add this new workflow to enable/disable this feature: + + In order to enable this feature, the platform would set ‘skip_xcvrd_cmis_mgr’ to ‘false’ in their respective pmon_daemon_control.json as part of platform bootstrap. When xcvrd would spawn on that hwsku (LC/board), it would parse ‘skip_xcvrd_cmis_mgr’ and if found 'false', it would launch CMIS task manager. This implies enabling this feature. +Else, if ‘skip_xcvrd_cmis_mgr’ is set/found 'true' by xcvrd, it would skip launching CMIS task manager and this feature would remain disabled. Workflow : - ![Enabling 'Interface link bring-up sequence' feature(3)](https://user-images.githubusercontent.com/69485234/152266723-050377ce-d4de-4c67-a405-5acc66474d46.png) + ![Enabling 'Interface link bring-up sequence' feature(2)](https://user-images.githubusercontent.com/69485234/154403945-654b49d7-e85f-4a7a-bb4d-e60a16b826a7.png) + # Transceiver Initialization From 94c1b2110916d78bb37cb9670c78b9ae95fa0c7d Mon Sep 17 00:00:00 2001 From: Dante Su Date: Fri, 1 Apr 2022 03:01:28 +0000 Subject: [PATCH 02/60] [autoneg] add support for the operational states and advanced controls per transceiver attached - Why I did this? 1. Add support for the operational states of AutoNeg 2. Furtherly clarify the AutoNeg behaviors for the SAI implementation Signed-off-by: Dante Su --- .../port-auto-negotiation-design.md | 124 ++++++++++++++---- 1 file changed, 98 insertions(+), 26 deletions(-) diff --git a/doc/port_auto_neg/port-auto-negotiation-design.md b/doc/port_auto_neg/port-auto-negotiation-design.md index 41a9ef83ae..798c98e598 100644 --- a/doc/port_auto_neg/port-auto-negotiation-design.md +++ b/doc/port_auto_neg/port-auto-negotiation-design.md @@ -26,7 +26,7 @@ - [SWSS Enhancements](#swss-enhancements) - [portsyncd and portmgrd Consideration](#portsyncd-and-portmgrd-consideration) - [Port Breakout Consideration](#port-breakout-consideration) - - [xcvrd Consideration](#xcvrd-consideration) + - [PMON xcvrd Consideration](#pmon-xcvrd-consideration) - [Warmboot and Fastboot Design Impact](#warmboot-and-fastboot-design-impact) - [Restrictions/Limitations](#restrictions/limitations) - [Testing Requirements/Design](#testing-requirements/design) @@ -36,10 +36,11 @@ ### Revision - | Rev | Date | Author | Change Description | - |:---:|:-----------:|:------------------:|-----------------------------------| - | 0.1 | | Junchao Chen | Initial version | - | 0.2 | | Junchao Chen | Fix review comment | + | Rev | Date | Author | Change Description | + |:---:|:-----------:|:-------------------:|--------------------------------------------| + | 0.1 | | Junchao Chen | Initial version | + | 0.2 | | Junchao Chen | Fix review comment | + | 0.3 | | Dante (Kuo-Jung) Su | Add support for SFPs and operational states| ### Scope This document is the design document for port auto negotiation feature on SONiC. This includes the requirements, CLI change, DB schema change, DB migrator change, yang model change and swss change. @@ -51,7 +52,12 @@ N/A The IEEE 802.3 standard defines a set of Ethernet protocols that are comprised of speed rate and interface type. It allows for configuring multiple values at the same time for port provisioning and advertising to the remote side. However, on SONiC, user can configure the speed of port, and user can configure auto negotiation mode via config DB. Port attributes such as interface type, advertised speeds, advertised interface types are not supported. -The feature in this document is to address the above issues. +The feature in this document is to address the above issues, and support the following medium typs + +- Twisted-pair cables (Non-Gearbox design) +- SFP/QSFP/QSFPDD CR/KR transceivers (Non-Gearbox design) + +The complexities behind vendor-specific SAI implementation is outside the scope of this document. ### Requirements @@ -86,6 +92,11 @@ Currently, SAI already defines a few port attributes to support port auto negoti 3. If autoneg is enabled and adv_speeds is not configured or empty, SAI must advertise it with all supported speeds. 4. If autoneg is enabled and adv_interface_types is not configured or empty, SAI must advertise it with all supported interface types. 5. If autoneg is disabled and interface_type is not configured, SAI must use SAI_PORT_INTERFACE_TYPE_NONE. +6. If autoneg is enabled, the administrative port speed updates should not disable the autoneg. The configured speed should be cached in swss#orchagent and gets replayed when autoneg is transitioned from enabled to disabled. +7. If autoneg is enabled, while the administrative interface type updates via CONFIG_DB should be blocked, the dynamic interface type updates from pmon#xcvrd via APPL_DB should be delivered to the SAI to update the autoneg advertisement. Please refer to [PMON xcvrd Consideration](#pmon-xcvrd-consideration) for details. +8. If autoneg is enabled on a SFP/QSFP/QSFPDD port, SAI should also activate the link-training to dynamically tune the TX FIR. +9. If autoneg is enabled on a SFP/QSFP/QSFPDD port, when it's transitioned to disabled, the port speed, FEC, interface type and TX FIR should be restored with the corresponding values in the APPL_DB. If the individual configuration is not present in the APPL_DB, the SAI driver defaults should be restored. Precisely speaking, default interface type is SAI_PORT_INTERFACE_TYPE_NONE, default fec mode is SAI_PORT_FEC_MODE_NONE and TX FIR is vendor-specific, as it's NOT a set of constants applicable to all switch ASIC. +10. If autoneg is enabled on a SFP/QSFP/QSFPDD port, the "fec" field of APPL_DB should override the result of autoneg. The related port attributes are listed below: ```cpp @@ -234,26 +245,29 @@ This command always replace the advertised interface types instead of append. Fo ##### Show interfaces auto negotiation status -As command `show interfaces status` already has 11 columns, a new CLI command will be added to display the port auto negotiation status. All data of this command are fetched from **APPL_DB**. +As command `show interfaces status` already has 11 columns, a new CLI command will be added to display the port auto negotiation status. All data of this command are fetched from **APPL_DB** and **STATE_DB**. ``` Format: - show interfaces autoneg-status + show interfaces autoneg status Arguments: interface_name: optional. Name of the interface to be shown. e.g: Ethernet0. If interface_name is not given, this command shows auto negotiation status for all interfaces. Example: - show interfaces autoneg-status - show interfaces autoneg-status Ethernet0 + show interfaces autoneg status + show interfaces autoneg status Ethernet0 Return: error message if interface_name is invalid otherwise: - Interface Auto-Neg Mode Speed Adv Speeds Type Adv Types Oper Admin ------------ --------------- ------- ------------ ------ ----------- ------ ------- - Ethernet0 disabled 25G N/A N/A N/A down up - Ethernet32 enabled 40G 40G,100G KR4 KR4,CR4 up up + Interface Auto-Neg Mode Speed Adv Speeds Rmt Adv Speeds Type Adv Types Oper Admin +----------- --------------- ------- ------------ ---------------- ------ ----------- ------ ------- + Ethernet0 enabled 400G N/A 400G CR4 CR4 up up + Ethernet8 enabled 400G N/A N/A KR4 KR4 down up + Ethernet16 enabled 400G N/A 400G CR4 CR4 up up + Ethernet24 N/A 400G N/A N/A N/A N/A down up + Ethernet32 disabled 400G N/A N/A N/A N/A down up ``` ##### CLI validation @@ -379,7 +393,7 @@ The change in APP_DB is similar to CONFIG_DB. 3 new fields **adv_speeds**, **int Valid value of the new fields are the same as **PORT** table in CONFIG_DB. Here is the table to map the fields and SAI attributes: -| **Parameter** | **sai_port_attr_t** +| **Parameter** | **sai_port_attr_t** | |---------------------|------------------------------------------------| | adv_interface_types | SAI_PORT_ATTR_ADVERTISED_INTERFACE_TYPE | | adv_speeds | SAI_PORT_ATTR_ADVERTISED_SPEED | @@ -390,15 +404,19 @@ Here is the table to map the fields and SAI attributes: #### State DB Enhancements To support validate interface speed on CLI side, a new field **supported_speeds** will be added to **PORT_TABLE**. +To support checking remote advertised speeds, a new field **rmt_adv_speeds** will be added to **PORT_TABLE**. ; Defines information for port state key = PORT_TABLE:port_name ; state of the port ; field = value ... supported_speeds = STRING ; supported speed list - speed = STRING ; operational speed + speed = STRING ; operational speed + rmt_adv_speeds = STRING ; advertised speed list of the remote -An example value of supported_speeds could be "10000,25000,40000,100000". +- supported_speeds: A list of supported speeds separated by commas, for example, "10000,25000,40000,100000". +- speed: Operational speed, for example, "100000". +- rmt_adv_speeds: A list of supported speeds advertised by the connected remote, for example, "10000,25000,40000,100000". Before this feature, port speed in APP DB indicates both the configured speed and the operational speed. It is OK without this feature because port operational speed must be configured speed or port operational status is down. However, this is not true with this feature. Consider following flow: @@ -413,6 +431,13 @@ To overcome this issue, following changes are required: 1. Put port operational speed to STATE DB PORT_TABLE 2. intfutil, portstat, voqutil shall be change to get port operational speed from STATE DB first. For backward compatible, intfutil, portstat, voqutil shall still get port operational speed from APP DB if port speed is not available in STATE DB or port operational state is down. +Here is the table to map the fields and SAI attributes: +| **Parameter** | **sai_port_attr_t** | +|---------------------|------------------------------------------------| +| rmt_adv_speeds | SAI_PORT_ATTR_REMOTE_ADVERTISED_SPEED | +| speed | SAI_PORT_ATTR_SPEED | +| supported_speeds | SAI_PORT_ATTR_SUPPORTED_SPEED | + #### YANG Model Enhancements The port yang model needs to update according to DB schema change. The yang model changes of new fields are described below: @@ -420,7 +445,7 @@ The port yang model needs to update according to DB schema change. The yang mode ``` leaf autoneg { type string { - pattern "0|1"; + pattern "off"|"on"; } } @@ -470,6 +495,8 @@ Will be migrated to: #### SWSS Enhancements +##### Setting Auto Negotiation + The current SONiC speed setting flow in PortsOrch can be described in following pseudo code: ``` @@ -511,6 +538,52 @@ else if autoneg == false: setInterfaceType(port, interface_type) ``` +##### Getting Negotiated Results + +The current SONiC operational speed getting flow in PortsOrch is as follow: + +- PortsOrch::doPortTask(Consumer &consumer) +``` +if isPortAutoNegChanged(port, autoneg): + setPortAutoNeg(port, autoneg) +``` + +The new SONiC operational speed getting flow in PortsOrch is as follow: + +- PortsOrch::doPortTask(Consumer &consumer) +``` +if isPortAutoNegChanged(port, autoneg): + rc = setPortAutoNeg(port, autoneg) + if (rc == SAI_STATUS_SUCCESS) and (autoneg == "on"): + setPortStateAutoNegPollEnabled(port, True) + else: + setPortStateAutoNegPollEnabled(port, False) +``` + +- PortsOrch::doTask(NotificationConsumer &consumer) +``` +if op == "port_state_change": + port = getPort(alias) + updatePortOperStatus(port, status) + if status == SAI_PORT_OPER_STATUS_UP: + updatePortStateAutoNeg(port) + setPortStateAutoNegPollEnabled(port, False) + elif isPortAutoNegEnabled(port): + setPortStateAutoNegPollEnabled(port, True) +``` + +- PortsOrch::doTask(SelectableTimer &timer) +``` +while PortsOrch is alive: + sleep_sec(1) + for port in all_port_list: + if not isPortStateAutoNegPollEnabled(port): + continue + updatePortStateAutoNeg(port) +``` + +##### Backward Compatibility Considerations + SONiC usually does not call SAI interface when there is no related configuration in APPL_DB. In order to keep backward compatible, this feature also apply this rule. swss will do validation for auto negotiation related fields, although it still CANNOT guarantee that all parameters passed to SAI will be accepted by SAI. swss validation for these field are described below: @@ -520,6 +593,7 @@ swss will do validation for auto negotiation related fields, although it still C 3. interface_type value from APPL_DB must be able to transfer to a valid interface type value. For invalid value, swss must catch the exception, log the error value and skip the rest configuration of this port. 4. adv_interface_types value from APPL_DB must be able to transfer to a list of valid interface type values. For invalid value, swss must catch the exception, log the error value and skip the rest configuration of this port. + #### portsyncd and portmgrd Consideration No changes for portsyncd and portmgrd. @@ -617,18 +691,16 @@ I choose this solution because: Dynamic port breakout feature also introduces a hwsku.json file to describe the port capability. It defines the default dynamic breakout mode for now. As we won't automatically set auto negotiation attributes for a port after port breakout, it is not necessary to change the hwsku.json in this feature. -#### xcvrd Consideration +#### PMON xcvrd Consideration It is recommended to use CLI/CONFIG_DB to setting the port auto negotiation attributes. But there is still other way. -There is a media_setting.json which is used for setting the default value for some port attributes. This media_setting.json is handled by xcvrd for setting pre-emphasis value for ports. xcvrd process the file this way: - -1. When xcvrd start, it reads the media_setting.json and set pre-emphasis values to APPL_DB for each port -2. When a new cable is inserted, xcvrd uses the value in media_setting.json to set pre-emphasis value to APPL_DB for this port. - -xcvrd just reads the configuration from media_settings.json and set value to APPL_DB. xcvrd does not care what the configuration is. So user could use media_settings.json to specify the default value for autoneg, adv_speeds and other port attributes. **Nothing needs to be changed in xcvrd**. +- **Interface Type** + Unfortunately, it's not straightforward for users to identify which interface type is most appropriate to the attached transceivers, and the link will not get up unless the connected devices are both advertising the same interface type. This requires domain knowledge, correct EERPOM information and the individual hardware datasheet review process. Hence it's recommended to use [media_settings.json](https://github.com/Azure/SONiC/blob/master/doc/media-settings/Media-based-Port-settings.md) to automate the while process. A interface type update request from [media_settings.json](https://github.com/Azure/SONiC/blob/master/doc/media-settings/Media-based-Port-settings.md) is triggered by the transceiver detection of pmon#xcvrd, which leverages **APPL_DB** instead of **CONFIG_DB**, hence the requests will not be blocked by **portsyncd**. If the interface type update request arrives when autoneg is enabled, it should alter the advertisement and restart the autoneg. +- **TX FIR/Pre-Emphasis** + IEEE 802.3 Clause 72, Clause 73 and Clause 93 define the autoneg and link-training support for CR/KR transceivers, while the support of opticals (e.g. SR/LR/DR) are never in the scope. On the other hand, when autoneg is enabled, the link-training will also be activated, and the link-training handshake will only get started after speed negotiation if autoneg is enabled. Furtherly, link-training is to dynamically tune hardware signals at runtime, as a result, the static TX FIR/Pre-Emphasis parameters in media_setting.json is not necessary and will not be taken into autoneg process. -However, it is worthy mentioning that: if user have port attributes configured both in CONFIG_DB and media_settings.json, the value in media_settings.json will override the value in CONFIG_DB after rebooting, restarting pmon or re-insert cables. Base on that, if user choose to use media_settings.json, they probably should not use CLI or CONFIG_DB to avoid configuration loss after rebooting, restarting pmon or re-insert cables. +If user have port attributes configured both in CONFIG_DB and media_settings.json, the value in media_settings.json will override the value in CONFIG_DB after rebooting, restarting pmon or re-insert cables. Base on that, if user choose to use media_settings.json, they probably should not use CLI or CONFIG_DB to avoid configuration loss after rebooting, restarting pmon or re-insert cables. ### Warmboot and Fastboot Design Impact From d8d0a2fed9ad79bcf43060c7b2522cbd71efc58a Mon Sep 17 00:00:00 2001 From: Shyam <69485234+shyam77git@users.noreply.github.com> Date: Tue, 5 Apr 2022 07:27:47 -0700 Subject: [PATCH 03/60] Update Interface-Link-bring-up-sequence.md Addressed PR review comments --- doc/sfp-cmis/Interface-Link-bring-up-sequence.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/sfp-cmis/Interface-Link-bring-up-sequence.md b/doc/sfp-cmis/Interface-Link-bring-up-sequence.md index f6c49c69e3..bf56fbf08b 100644 --- a/doc/sfp-cmis/Interface-Link-bring-up-sequence.md +++ b/doc/sfp-cmis/Interface-Link-bring-up-sequence.md @@ -33,6 +33,7 @@ Deterministic Approach for Interface Link bring-up sequence | 0.6 | 02/02/2022 | Shyam Kumar | Added feature-enablement workflow | 0.7 | 02/02/2022 | Jaganathan Anbalagan | Added Breakout Handling | 0.8 | 02/16/2022 | Shyam Kumar | Updated feature-enablement workflow +| 0.9 | 04/05/2022 | Shyam Kumar | Addressed review comments | # About this Manual @@ -154,6 +155,9 @@ Please refer to the flow/sequence diagrams which covers the following required In order to enable this feature, the platform would set ‘skip_xcvrd_cmis_mgr’ to ‘false’ in their respective pmon_daemon_control.json as part of platform bootstrap. When xcvrd would spawn on that hwsku (LC/board), it would parse ‘skip_xcvrd_cmis_mgr’ and if found 'false', it would launch CMIS task manager. This implies enabling this feature. Else, if ‘skip_xcvrd_cmis_mgr’ is set/found 'true' by xcvrd, it would skip launching CMIS task manager and this feature would remain disabled. +If a platform/vendor does not specify/set ‘skip_xcvrd_cmis_mgr’, xcvrd would exercise the default workflow (i.e. when xcvrd detects QSFP-DD, it will initialize the module per CMIS specification). +Note: This feature flag (skip_xcvrd_cmis_mgr) was added as a flexibility in case vendor/platform intend to disable this feature and not use CMIS mgr. +However, techinically, as mentioned in this document, that should not be the case. Workflow : ![Enabling 'Interface link bring-up sequence' feature(2)](https://user-images.githubusercontent.com/69485234/154403945-654b49d7-e85f-4a7a-bb4d-e60a16b826a7.png) From c2752a2a5a9a68274f0f925694647397e1e72598 Mon Sep 17 00:00:00 2001 From: Shyam <69485234+shyam77git@users.noreply.github.com> Date: Tue, 5 Apr 2022 07:32:51 -0700 Subject: [PATCH 04/60] Update Interface-Link-bring-up-sequence.md Addresses latest PR review comments --- doc/sfp-cmis/Interface-Link-bring-up-sequence.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/sfp-cmis/Interface-Link-bring-up-sequence.md b/doc/sfp-cmis/Interface-Link-bring-up-sequence.md index bf56fbf08b..227c0d4176 100644 --- a/doc/sfp-cmis/Interface-Link-bring-up-sequence.md +++ b/doc/sfp-cmis/Interface-Link-bring-up-sequence.md @@ -154,10 +154,11 @@ Please refer to the flow/sequence diagrams which covers the following required In order to avoid any breakage and ensure gradual migration of different platforms/vendors to this model, will add this new workflow to enable/disable this feature: In order to enable this feature, the platform would set ‘skip_xcvrd_cmis_mgr’ to ‘false’ in their respective pmon_daemon_control.json as part of platform bootstrap. When xcvrd would spawn on that hwsku (LC/board), it would parse ‘skip_xcvrd_cmis_mgr’ and if found 'false', it would launch CMIS task manager. This implies enabling this feature. + Else, if ‘skip_xcvrd_cmis_mgr’ is set/found 'true' by xcvrd, it would skip launching CMIS task manager and this feature would remain disabled. -If a platform/vendor does not specify/set ‘skip_xcvrd_cmis_mgr’, xcvrd would exercise the default workflow (i.e. when xcvrd detects QSFP-DD, it will initialize the module per CMIS specification). -Note: This feature flag (skip_xcvrd_cmis_mgr) was added as a flexibility in case vendor/platform intend to disable this feature and not use CMIS mgr. -However, techinically, as mentioned in this document, that should not be the case. +If a platform/vendor does not specify/set ‘skip_xcvrd_cmis_mgr’, xcvrd would exercise the default workflow (i.e. when xcvrd detects QSFP-DD, it would luanch CMIS task manager and initialize the module per CMIS specification). + +Note: This feature flag (skip_xcvrd_cmis_mgr) was added as a flexibility in case vendor/platform intend to disable this feature and not use CMIS task manager. However, techinically, as mentioned in this document, that should not be the case. Workflow : ![Enabling 'Interface link bring-up sequence' feature(2)](https://user-images.githubusercontent.com/69485234/154403945-654b49d7-e85f-4a7a-bb4d-e60a16b826a7.png) From 1c6f54984c34f42c78ad1f799e67479a1b565c84 Mon Sep 17 00:00:00 2001 From: Dante Su Date: Mon, 11 Apr 2022 05:33:36 +0000 Subject: [PATCH 05/60] add details to "PMON xcvrd Consideration" Signed-off-by: Dante Su --- doc/port_auto_neg/port-auto-negotiation-design.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/doc/port_auto_neg/port-auto-negotiation-design.md b/doc/port_auto_neg/port-auto-negotiation-design.md index 798c98e598..8888bfdd43 100644 --- a/doc/port_auto_neg/port-auto-negotiation-design.md +++ b/doc/port_auto_neg/port-auto-negotiation-design.md @@ -693,14 +693,13 @@ Dynamic port breakout feature also introduces a hwsku.json file to describe the #### PMON xcvrd Consideration -It is recommended to use CLI/CONFIG_DB to setting the port auto negotiation attributes. But there is still other way. +While it is possible to use CLI/CONFIG_DB for setting the port auto negotiation attributes, this feature is also available via [media_settings.json](https://github.com/Azure/SONiC/blob/master/doc/media-settings/Media-based-Port-settings.md) - **Interface Type** - Unfortunately, it's not straightforward for users to identify which interface type is most appropriate to the attached transceivers, and the link will not get up unless the connected devices are both advertising the same interface type. This requires domain knowledge, correct EERPOM information and the individual hardware datasheet review process. Hence it's recommended to use [media_settings.json](https://github.com/Azure/SONiC/blob/master/doc/media-settings/Media-based-Port-settings.md) to automate the while process. A interface type update request from [media_settings.json](https://github.com/Azure/SONiC/blob/master/doc/media-settings/Media-based-Port-settings.md) is triggered by the transceiver detection of pmon#xcvrd, which leverages **APPL_DB** instead of **CONFIG_DB**, hence the requests will not be blocked by **portsyncd**. If the interface type update request arrives when autoneg is enabled, it should alter the advertisement and restart the autoneg. -- **TX FIR/Pre-Emphasis** - IEEE 802.3 Clause 72, Clause 73 and Clause 93 define the autoneg and link-training support for CR/KR transceivers, while the support of opticals (e.g. SR/LR/DR) are never in the scope. On the other hand, when autoneg is enabled, the link-training will also be activated, and the link-training handshake will only get started after speed negotiation if autoneg is enabled. Furtherly, link-training is to dynamically tune hardware signals at runtime, as a result, the static TX FIR/Pre-Emphasis parameters in media_setting.json is not necessary and will not be taken into autoneg process. + Unfortunately, it's not straightforward for users to identify which interface type is most appropriate to the attached transceivers, and the link will not get up unless the connected devices are both advertising the same interface type. This requires domain knowledge, correct EERPOM information and the individual hardware datasheet review process. Hence it's recommended to use [media_settings.json](https://github.com/Azure/SONiC/blob/master/doc/media-settings/Media-based-Port-settings.md) to automate the while process. A interface type update request from [media_settings.json](https://github.com/Azure/SONiC/blob/master/doc/media-settings/Media-based-Port-settings.md) is triggered by the transceiver detection of pmon#xcvrd, which leverages **APPL_DB** instead of **CONFIG_DB**, hence the requests will not be blocked by **portsyncd**. If the interface type update request arrives when autoneg is enabled, it should alter the advertisement and restart the autoneg. That said, if the user has interface type configured in both CONFIG_DB and media_settings.json, it wouldn't be possible to predict which would take precedence as there is no logic giving one priority over other. Hence please be sure to use either CLI/CONFIG_DB or media_settings.json at a time, never have both of them activated. -If user have port attributes configured both in CONFIG_DB and media_settings.json, the value in media_settings.json will override the value in CONFIG_DB after rebooting, restarting pmon or re-insert cables. Base on that, if user choose to use media_settings.json, they probably should not use CLI or CONFIG_DB to avoid configuration loss after rebooting, restarting pmon or re-insert cables. +- **Pre-Emphasis** + Typically, prior to some process, such as transmission over cable, or recording to phonograph record or tape, the input frequency range most susceptible to noise is boosted. This is referred to as "pre-emphasis" - before the process the signal will undergo. While this is rarely necessay to the native RJ45 ports, it's important to SFP/QSFP/QSFPDD ports. For optical arrangements (e.g. SR/LR/DR transceivers), the loss is miniscule. The loss budget allocated for the host PCB board is small, which implies the pre-emphasis calibrated is supposed to work regardless of the fiber cable attached. On the other hand, on passive media, there is a significant amount of frequency dependent loss and the channel loss can range up to the CR/KR loss spec. It is therefore important and useful to activate Link-Training to "train" the TX FIR in both directions to help equalize that loss. IEEE 802.3 Clause 72, Clause 73 and Clause 93 define the auto-negotiation and link-training support for CR/KR transceivers, while the support of opticals (e.g. SR/LR/DR) are never in the scope. On the other hand, when autoneg is enabled, the link-training will also be activated, and the link-training handshake will only get started after negotiation if autoneg is enabled. Furtherly, link-training is to dynamically tune hardware signals at runtime, as a result, the static pre-emphasis parameters in media_setting.json is not necessary and will not be taken into autoneg process. ### Warmboot and Fastboot Design Impact From 1cfa5041db5326c816725c487e73bfb77118c527 Mon Sep 17 00:00:00 2001 From: Dante Su Date: Mon, 11 Apr 2022 08:47:40 +0000 Subject: [PATCH 06/60] Add flow chart for remote advertisement Signed-off-by: Dante Su --- doc/port_auto_neg/flow_rmt_adv.png | Bin 0 -> 24396 bytes .../port-auto-negotiation-design.md | 44 ++---------------- 2 files changed, 3 insertions(+), 41 deletions(-) create mode 100644 doc/port_auto_neg/flow_rmt_adv.png diff --git a/doc/port_auto_neg/flow_rmt_adv.png b/doc/port_auto_neg/flow_rmt_adv.png new file mode 100644 index 0000000000000000000000000000000000000000..184a9fc77067462311273865d8e3d5a5b9d250ef GIT binary patch literal 24396 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 a_n%#0oukU$iOGTtK;Y@>=d#Wzp$Pz*Zyl)s literal 0 HcmV?d00001 diff --git a/doc/port_auto_neg/port-auto-negotiation-design.md b/doc/port_auto_neg/port-auto-negotiation-design.md index 8888bfdd43..dfebd151c0 100644 --- a/doc/port_auto_neg/port-auto-negotiation-design.md +++ b/doc/port_auto_neg/port-auto-negotiation-design.md @@ -538,49 +538,11 @@ else if autoneg == false: setInterfaceType(port, interface_type) ``` -##### Getting Negotiated Results +##### Getting Remote Advertisement -The current SONiC operational speed getting flow in PortsOrch is as follow: +A new periodic timer task will be introduced into PortsOrch, it periodically loops through physical ports and update the per-port remote advertisement if autoneg is enabled and the link is down. -- PortsOrch::doPortTask(Consumer &consumer) -``` -if isPortAutoNegChanged(port, autoneg): - setPortAutoNeg(port, autoneg) -``` - -The new SONiC operational speed getting flow in PortsOrch is as follow: - -- PortsOrch::doPortTask(Consumer &consumer) -``` -if isPortAutoNegChanged(port, autoneg): - rc = setPortAutoNeg(port, autoneg) - if (rc == SAI_STATUS_SUCCESS) and (autoneg == "on"): - setPortStateAutoNegPollEnabled(port, True) - else: - setPortStateAutoNegPollEnabled(port, False) -``` - -- PortsOrch::doTask(NotificationConsumer &consumer) -``` -if op == "port_state_change": - port = getPort(alias) - updatePortOperStatus(port, status) - if status == SAI_PORT_OPER_STATUS_UP: - updatePortStateAutoNeg(port) - setPortStateAutoNegPollEnabled(port, False) - elif isPortAutoNegEnabled(port): - setPortStateAutoNegPollEnabled(port, True) -``` - -- PortsOrch::doTask(SelectableTimer &timer) -``` -while PortsOrch is alive: - sleep_sec(1) - for port in all_port_list: - if not isPortStateAutoNegPollEnabled(port): - continue - updatePortStateAutoNeg(port) -``` +![](flow_rmt_adv.png) ##### Backward Compatibility Considerations From ffafcdf2946842d345e2d2a8f7a6ec3ca0923ab4 Mon Sep 17 00:00:00 2001 From: bingwang Date: Thu, 14 Apr 2022 00:56:00 -0700 Subject: [PATCH 07/60] Add FLAGS table Signed-off-by: bingwang --- ...ontrol-sonic-behaviors-with-sonic-flags.md | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md diff --git a/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md b/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md new file mode 100644 index 0000000000..5422f8eb3c --- /dev/null +++ b/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md @@ -0,0 +1,108 @@ +# Control SONiC behaviors with FLAGS table + +## 1 Table of Content ### + +- [Revision](#11-revision) +- [Scope](#2-scope) +- [Definitions/Abbreviations](#3-definitionsabbreviations) +- [Overview](#4-overview) +- [Design](#5-design) +- [Change required](#6-change-required) +- [Test requirement](#7-test-requirement) + + +### 1.1 Revision ### +| Rev | Date | Author | Change Description | +|:---:|:-----------:|:------------------:|-----------------------------------| +| 0.1 | | Bing Wang | Initial version | + + +## 2 Scope ## + +This document covers high level design of `FLAGS` table in SONiC. + +## 3 Definitions/Abbreviations ## + + +| Term | Meaning | +|:--------:|:---------------------------------------------:| +| | | + + +## 4 Overview + +A number of flags are required to turn on/off certain feature or control the behaviors of various features in SONiC. Currently, these flags are put into `DEVICE_METADATA` table. + +``` + "DEVICE_METADATA": { + "localhost": { + "default_bgp_status": "down", + "default_pfcwd_status": "enable", + "synchronous_mode": "enable", + "dhcp_server": "enable" + } + } +``` +As a result, the `DEVICE_METADATA` table is inflating rapidly as we are having more and more flags, although these flags seem not to be categorized into `DEVICE_METADATA` + +To have a better management of the flags, a new table `FLAGS` is introduced in this design. + +## 5 Design ## + +### 5.1 DB Schema + +A new table `FLAGS` is added into config_db. +``` + key = FLAGS + + ;field = value + FLAG_NAME = 1*255VCHAR ; FLAG_NAME must be unique, the value is a string, which can be 'enable'/'disable', 'down'/'up' or any string. +``` +Below is a sample of `FLAGS` table + +``` +"FLAGS": { + "default_bgp_status": "down", + "default_pfcwd_status": "enable", + "synchronous_mode": "enable", + "dhcp_server": "enable" + } +``` + +### 5.2 How to update flags in `FLAGS` table + +#### 5.2.1 Set default value with `init_cfg.json` + +The default vaule of flags in `FLAGS` table can be set in `init_cfg.json` and loaded into db at system startup. These flags are usually set at image being build, and are unlikely to change at runtime. + +#### 5.2.2 Parse from `minigraph.xml` when loading minigraph + +For the flags that can be changed by reconfiguration, we can update entries in `minigraph.xml`, and parse the new values in to config_db with minigraph parser at reloading minigraph. + +#### 5.2.3 Update value directly in db memory +For some behavior change, we may don't have to interrupt dataplane. To support controlling SONiC behavior on-the-fly, we can update the value of flags in memory with tools like `sonic-cfggen`, `configlet` or `config apply-patch`. + +### 5.3 How to consume flags in `FLAGS` table + +#### 5.3.1 Consume at service startup or reload +All of the flags in `FLAGS` table can be consumed at service startup or reload as we do now. We can use the flags to render templates or control the running path of code. + +#### 5.3.2 Consume on-the-fly without interrupting traffic +The `FLAGS` table can be subscribed by components that are interested on the flags. Hence, the in-memory change of flags will be consumed by running service, and take effect without reloading if possible. + +## 6 Change required ## +### 6.1 Template update +1. Templates that generate default values in `DEVICE_METADATA|localhost` table are required to be updated. The generated flags will be put into `FLAGS` table now. +2. Templates that depend on `DEVICE_METADATA|localhost` table are required to be updated. + +### 6.2 Yang model update +A new Yang model is to be added to restrict the valid flags in `FLAGS` table. The existing entries for flags in current [sonic-device_metadata.yang](https://github.com/Azure/sonic-buildimage/blob/master/src/sonic-yang-models/yang-models/sonic-device_metadata.yang) are to be removed. + +### 6.3 Code change +1. Update `db_migrator.py` to migrate flags from `DEVICE_METADATA|localhost` table to `FLAGS` table. +2. Update the code of component to subscribe `FLAGS` table to watch the update. + +## 7 Test requirement +TBA + + \ No newline at end of file From 8f25113ea7d8b26793eb5eec7df40ce7551176d9 Mon Sep 17 00:00:00 2001 From: bingwang Date: Mon, 18 Apr 2022 02:24:37 -0700 Subject: [PATCH 08/60] Add clarification for init_cfg Signed-off-by: bingwang --- .../control-sonic-behaviors-with-sonic-flags.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md b/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md index 5422f8eb3c..30fd5c4702 100644 --- a/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md +++ b/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md @@ -73,8 +73,20 @@ Below is a sample of `FLAGS` table #### 5.2.1 Set default value with `init_cfg.json` -The default vaule of flags in `FLAGS` table can be set in `init_cfg.json` and loaded into db at system startup. These flags are usually set at image being build, and are unlikely to change at runtime. +The default value of flags in `FLAGS` table can be set in `init_cfg.json` and loaded into db at system startup. These flags are usually set at image being build, and are unlikely to change at runtime. +If the values in `config_db.json` is changed by user, it will not be rewritten back by `init_cfg.json` as `config_db.json` is loaded after `init_cfg.json` in [docker_image_ctl.j2](https://github.com/Azure/sonic-buildimage/blob/master/files/build_templates/docker_image_ctl.j2) + +``` +if [ -r /etc/sonic/config_db$DEV.json ]; then + if [ -r /etc/sonic/init_cfg.json ]; then + $SONIC_CFGGEN -j /etc/sonic/init_cfg.json -j /etc/sonic/config_db$DEV.json --write-to-db + else + $SONIC_CFGGEN -j /etc/sonic/config_db$DEV.json --write-to-db + fi +fi +``` +For example, the value of `default_bgp_status` is down in `init_cfg.json` if `shutdown_bgp_on_start` is set to `y` when image is being built. If we modify the value of `default_bgp_status` in `config_db.json` to `up`, it will keep `up`. #### 5.2.2 Parse from `minigraph.xml` when loading minigraph For the flags that can be changed by reconfiguration, we can update entries in `minigraph.xml`, and parse the new values in to config_db with minigraph parser at reloading minigraph. From 12f4c2a81cb020f9a68bb835763ab2ce40ea19aa Mon Sep 17 00:00:00 2001 From: bingwang Date: Mon, 18 Apr 2022 23:54:22 -0700 Subject: [PATCH 09/60] List existing flags Signed-off-by: bingwang --- .../control-sonic-behaviors-with-sonic-flags.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md b/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md index 30fd5c4702..616fbdd796 100644 --- a/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md +++ b/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md @@ -74,7 +74,6 @@ Below is a sample of `FLAGS` table #### 5.2.1 Set default value with `init_cfg.json` The default value of flags in `FLAGS` table can be set in `init_cfg.json` and loaded into db at system startup. These flags are usually set at image being build, and are unlikely to change at runtime. - If the values in `config_db.json` is changed by user, it will not be rewritten back by `init_cfg.json` as `config_db.json` is loaded after `init_cfg.json` in [docker_image_ctl.j2](https://github.com/Azure/sonic-buildimage/blob/master/files/build_templates/docker_image_ctl.j2) ``` @@ -111,8 +110,18 @@ The `FLAGS` table can be subscribed by components that are interested on the fla A new Yang model is to be added to restrict the valid flags in `FLAGS` table. The existing entries for flags in current [sonic-device_metadata.yang](https://github.com/Azure/sonic-buildimage/blob/master/src/sonic-yang-models/yang-models/sonic-device_metadata.yang) are to be removed. ### 6.3 Code change -1. Update `db_migrator.py` to migrate flags from `DEVICE_METADATA|localhost` table to `FLAGS` table. -2. Update the code of component to subscribe `FLAGS` table to watch the update. +1. Update `db_migrator.py` to migrate flags from `DEVICE_METADATA|localhost` table to `FLAGS` table. Current flags include + +|Flag|Source| +|--|--| +|default_bgp_status| From init_cfg.json, the value is determined by option shutdown_bgp_on_start when image being built| +|default_pfcwd_status|From init_cfg.json, the value is determined by option enable_pfcwd_on_start when image being built| +|synchronous_mode|From init_cfg.json, the value is determined by option include_p4rt when image being built| +|buffer_model|From init_cfg.json, the value is determined by option default_buffer_model when image being built| +|dhcp_server| Parse from minigraph.xml| + + +2. Add code to subscribe `FLAGS` table to get the update notification for components that is interested in the `FLAGS` change. Currently, all orchs and daemons don't support changing flag controlled behaviors without restarting service, so no code change is required for existing components. ## 7 Test requirement TBA From 184a5dcd352e8094c37ad9888c969be24e7b8713 Mon Sep 17 00:00:00 2001 From: Xuhui Miao Date: Sat, 7 May 2022 12:26:24 +0800 Subject: [PATCH 10/60] Add the SONiC FIPS configure intruduction --- doc/fips/SONiC-OpenSSL-FIPS-140-3.md | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/doc/fips/SONiC-OpenSSL-FIPS-140-3.md b/doc/fips/SONiC-OpenSSL-FIPS-140-3.md index aa750592d5..cf84870478 100644 --- a/doc/fips/SONiC-OpenSSL-FIPS-140-3.md +++ b/doc/fips/SONiC-OpenSSL-FIPS-140-3.md @@ -5,6 +5,7 @@ | Rev | Date | Author | Change Description | | :---: | :--------: | :--------: | ------------------ | | 0.1 | 2022-02-22 | Xuhui Miao | Initial version | +| 0.2 | 2022-05-07 | Xuhui Miao | Update Fips config | ## Table of Contents - [Abbreviation](#abbreviation) @@ -126,14 +127,29 @@ For OpenSSH, Centos provides a [patch](https://git.centos.org/rpms/openssh/raw/c ## SONiC FIPS Configuration ### Enable FIPS on system level -Add the Linux System parameter fips=1, in grub config, one of implemetation as below: +Set the Linux System parameter sonic_fips=1, to validate if the FIPS is enabled: +``` +grep 'sonic_fips=1' /proc/cmdline +``` +There is another parameter fips=1 supported for SymCrypt OpenSSL to enable FIPS. The parameter will enable the Linux Kernel FIPS, but the Linux Kernel FIPS is not supported yet, and it is out of scope in this document. In future, when the FIPS is supported by SONiC Linux Kernel, and the parameter fips=1 has already set, it is not necessary to set sonic_fips=1. + +For grub, one of implemetation as below: cat /etc/grub.d/99-fips.cfg ``` -GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT fips=1" +GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT sonic_fips=1" +``` + +For uboot, use fw_setenv to variable linuxargs to change the boot options. +``` +OTHER_OPTIONS=$(fw_printenv linuxargs | sed 's/linuxargs=//') +fw_setenv linuxargs "$OTHER_OPTIONS sonic_fips=1" ``` -To validate the FIPS enabled, grep 'fips=1' /proc/cmdline. +For Aboot, add the config in /host/image-{version}/kernel-cmdline, example: +``` +reboot=p console=ttyS0 acpi=on Aboot=Aboot-norcal7-7.2.0-pcie2x4-6128821 sonic_fips=1 +``` ### Enable FIPS on application level ``` From c5fd06a802b21885df8e1266f851cc77ad2b8c94 Mon Sep 17 00:00:00 2001 From: Vivek R Date: Tue, 10 May 2022 02:47:44 -0700 Subject: [PATCH 11/60] [Auto-Techsupport] Minor Changes to Auto-Techsupport Feature Documented (#990) Changes include the following: APP Extension Registry/De-Registry Remove the stale information related to SONiC-SONiC upgrade Section Related to Tech-support Locking mechanism --- doc/auto_techsupport_and_coredump_mgmt.md | 155 +++++++--------------- 1 file changed, 48 insertions(+), 107 deletions(-) diff --git a/doc/auto_techsupport_and_coredump_mgmt.md b/doc/auto_techsupport_and_coredump_mgmt.md index 45640d2423..2341abbd95 100644 --- a/doc/auto_techsupport_and_coredump_mgmt.md +++ b/doc/auto_techsupport_and_coredump_mgmt.md @@ -7,25 +7,29 @@ * [1. Overview](#1-overview) * [2. High Level Requirements](#2-high-level-requirements) * [3. Core Dump Generation in SONiC](#3-core-dump-generation-in-sonic) - * [4. Schema Additions](#4-schema-additions) - * [6. CLI Enhancements](#5-cli-enhancements) + * [4. Memory usage based techsupport invocation](#4-Memory-usage-based-techsupport-invocation) + * [5. Schema Additions](#5-schema-additions) + * [6. CLI Enhancements](#6-cli-enhancements) * [7. Design](#6-design) - * [6.1 Modifications to coredump-compress script](#61-Modifications-to-coredump-compress-script) - * [6.2 coredump_gen_handler script](#62-coredump_gen_handler-script) - * [6.3 Modifications to generate_dump script](#64-Modifications-to-generate-dump-script) - * [6.4 techsupport_cleanup script](#65-techsupport_cleanup-script) - * [6.5 Warmboot consideration](#65-Warmboot-consideration) - * [6.6 MultiAsic consideration](#66-MultiAsic-consideration) - * [6.7 Design choices for max-techsupport-limit & max-techsupport-limit arguments](#67-Design-choices-for-max-core-limit-&-max-techsupport-limit-arguments) - * [8. Test Plan](#7-Test-Plan) - * [9. SONiC-to-SONiC Upgrade Considerations](#8-SONiC-to-SONiC-Upgrade-Considerations) + * [7.1 Modifications to coredump-compress script](#71-Modifications-to-coredump-compress-script) + * [7.2 coredump_gen_handler script](#72-coredump_gen_handler-script) + * [7.3 Modifications to generate_dump script](#73-Modifications-to-generate-dump-script) + * [7.4 techsupport_cleanup script](#74-techsupport_cleanup-script) + * [7.5 Warmboot consideration](#75-Warmboot-consideration) + * [7.6 MultiAsic consideration](#76-MultiAsic-consideration) + * [7.7 Design choices for max-techsupport-limit & max-techsupport-limit arguments](#77-Design-choices-for-max-core-limit-&-max-techsupport-limit-arguments) + * [7.8 Techsupport Locking](#78-Techsupport-Locking) + * [8. Test Plan](#8-Test-Plan) + * [9. SONiC-to-SONiC Upgrade Considerations](#9-SONiC-to-SONiC-Upgrade-Considerations) + * [10. App Extension Consideration](#9-App-Extension-Considerations) + * [11. Open questions](#10-Open-questions) ### Revision | Rev | Date | Author | Change Description | |:---:|:-----------:|:-------------------------|:----------------------| | 1.0 | 06/22/2021 | Vivek Reddy Karri | Auto Invocation of Techsupport, triggered by a core dump | -| 1.1 | TBD | Vivek Reddy Karri | Add the capability to Register/Deregister app extension to AUTO_TECHSUPPORT_FEATURE table | +| 1.1 | 04/08/2022 | Vivek Reddy Karri | Add the capability to Register/Deregister app extension to AUTO_TECHSUPPORT_FEATURE table | | 2.0 | TBD | Vivek Reddy Karri | Extending Support for Kernel Dumps | | 3.0 | 02/2022 | Stepan Blyshchak | Extending Support for memory usage threshold crossed | @@ -380,13 +384,13 @@ sonic_dump_r-lionfish-16_20210901_222408 teamd python3.1630535045.34. ``` -## 6. Design +## 7. Design -### 6.1 Modifications to coredump-compress script +### 7.1 Modifications to coredump-compress script The coredump-compress script is updated to invoke the `coredump_gen_handler` script once it is done writing the core file to /var/core. Any stdout/stderr seen during the execution of `coredump_gen_handler` script is redirected to `/tmp/coredump_gen_handler.log`. This script is enhanced to determine which container the dump belongs to and passes it to the coredump_gen_handler script. -### 6.2 coredump_gen_handler script +### 7.2 coredump_gen_handler script A script under the name `coredump_gen_handler.py` is added to `/usr/local/bin/` directory which will be invoked after a coredump is generated. The script first checks if this feature is enabled by the user. The script then verifies if a core dump file is created within the last 20 sec and if yes, it moves forward. @@ -405,11 +409,11 @@ DATE sonic NOTICE coredump_gen_handler[pid]: coredump_cleanup is disabled. No c DATE sonic ERR coredump_gen_handler[pid]: "show techsupport --since '2 days ago'" was run, but no techsupport dump is found ``` -### 6.3 Modifications to generate_dump script +### 7.3 Modifications to generate_dump script The generate_dump script is updated to invoke the `techsupport_cleanup` script to handle the cleanup of techsupport files. Any stdout/stderr seen during the execution of `techsupport_cleanup` script is redirected to `/tmp/coredump_gen_handler.log` -### 6.4 techsupport_cleanup script +### 7.4 techsupport_cleanup script A script under the name `techsupport_cleanup.py` is added to `/usr/local/bin/` directory which will be invoked after a techsupport dump is created. The script first checks if the feature is enabled by the user. It then checks if the limit configured by the user has crossed and deletes the old techsupport files, if any. @@ -419,17 +423,17 @@ DATE sonic NOTICE techsupport_cleanup[pid]: techsupport_cleanup is disabled. No DATE sonic INFO coredump_gen_handler[pid]: max-techsupport-size argument is not set. No Cleanup is performed, current size occupied: 456 MB ``` -### 6.5 Warmboot consideration +### 7.5 Warmboot consideration No changes to this flow -### 6.6 MultiAsic consideration +### 7.6 MultiAsic consideration Configuration specified for the default feature name in the AUTO_TECHSUPPORT_FEATURE table is applied across all the masic instances. i.e. rate_limit_interval defined in the AUTO_TECHSUPPORT_FEATURE|swss key is applied for swss1, swss2, etc -### 6.7 Design choices for max-techsupport-limit & max-techsupport-limit arguments +### 7.7 Design choices for max-techsupport-limit & max-techsupport-limit arguments Firstly, Size-based cleanup design was inspired from MaxUse= Argument in the systemd-coredump.conf https://www.freedesktop.org/software/systemd/man/coredump.conf.html @@ -452,7 +456,15 @@ A default value of 5% would amount to a minimum of 500 MB which is a already a d Although if the admin feels otherwise, these values are configurable. -## 7. Test Plan +### 7.8 Techsupport Locking + +Recently, an enhancement was made to techsupport script to only run one instance at a time by using a locking mechanism. When other script instance of techsupport tries to run, it'll exit with a relevent code. This would apply nevertheless of how a techsupport was invoked i.e. manual or through auto-techsupport. + +With this change, rate-limit-interval of zero would not make any difference. The locking mechanism would implicitly impose a minimum rate-limit-interval of techsupport execution time. And since, the techsupport execution time can't be found out and varies based on underlying machine and system state, the range of values configurable for the rate-limit-interval is left unchanged + +A relevant message will be logged to syslog when the invocation fails because of LOCKFAIL exit code. + +## 8. Test Plan Enhance the existing techsupport sonic-mgmt test with the following cases. @@ -462,96 +474,25 @@ Enhance the existing techsupport sonic-mgmt test with the following cases. | 2 | Check if the techsupport cleanup is working as expected | | 3 | Check if the global rate-& & per-process rate-limit-interval is working as expected | | 4 | Check if the core-dump cleanup is working as expected | -| 5 | Check if the core-dump generated when reaching memory threshold | -## 8. SONiC-to-SONiC Upgrade Considerations +| 5 | Check if the core-dump generated when reaching memory threshold | -The default config required for auto_techsupport is present in the init_cfg.json. Therefore, when a clean installation of SONiC is performed, the configuration is found in the config DB and the feature is active. +## 9. SONiC-to-SONiC Upgrade Considerations -However, in the case of SONiC-SONiC upgrade, the previous config_db.json is migrated and init_cfg.json is not involved. In that case, it is the responsibility of the admin to provide the config, if the admin wants to leverage this feature. +The configuration in the init_cfg.json is loaded to the running config i.e. CONFIG_DB even in the case of SONiC-SONiC upgrade from a older image which doesn't support this feature. -Load this Example config provided below to enable the feature. Each of the fields are explained in Section 4 and can be modified accordingly +### 10 App Extension Considerations + +Detailed Info related to Appliation Extension can be found here: https://github.com/Azure/SONiC/blob/master/doc/sonic-application-extension/sonic-application-extention-hld.md + +A new AUTO_TECHSUPPORT_FEATURE register/deregister option will be introduced. The existing FeatureRegistry class will be enahcned to also add/delete configuration related to AUTO_TECHSUPPORT_FEATURE table. + +This will be run when the application installs/uninstalls. Since, the auto-techsupport feature uses compile time flag to determine whether to enable/disable itself, it is not possible to determine that at runtime when the application is installed. + +Thus the decision to whether or not to enable the new feature will be based on the current values of AUTO_TECHSUPPORT & AUTO_TECHSUPPORT_FEATURE tables. The default value for new feature will be disabled if the global state is shown disabled in init_cfg.json. If not, the feature will be enabled. The rate-limit-interval & memory threshold is set to 600 & 10% by default. + +When the app get un-installed, all the config will be cleared unless keep-config option is used. -``` -{ - "AUTO_TECHSUPPORT": { - "GLOBAL": { - "state": "enabled", - "rate_limit_interval": "180", - "max_techsupport_limit": "10.0", - "max_core_limit": "5.0", - "available_mem_threashold": "10.0", - "since": "2 days ago" - } - }, - "AUTO_TECHSUPPORT_FEATURE": { - "bgp": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "database": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "lldp": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "pmon": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "radv": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "snmp": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "swss": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "syncd": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "teamd": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "dhcp_relay": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "mgmt-framework": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "mux": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "nat": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "sflow": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "macsec": { - "state": "enabled", - "rate_limit_interval": "600" - }, - "telemetry": { - "state": "enabled", - "rate_limit_interval": "600" - } - } -} -``` -# Open question +## 11. Open questions 1. Is 10 % free memory/90 % used memory threshold a reasonable default? From 63a29ad85d301a607b352c6f9403b88b8ac1e97a Mon Sep 17 00:00:00 2001 From: kannankvs Date: Wed, 11 May 2022 10:08:05 +0530 Subject: [PATCH 12/60] updated the video file (#998) updated the video file for David Maltz on keynote session --- index.html | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/index.html b/index.html index 83ffdefa2e..75f120a000 100644 --- a/index.html +++ b/index.html @@ -229,9 +229,10 @@

Rapidly Growing Ecosystem

-

Past SONiC Events

+

Past SONiC Events

-
+
+
@@ -247,10 +248,13 @@

Rapidly Growing Ecosystem

-
-

Virtual Event Video clip coming soon

-
img
-
+
+ +

Past SONiC Events

+
+
+
+
From 0e81b38dd604fb7e410497bcee30138aaba2dae3 Mon Sep 17 00:00:00 2001 From: bingwang-ms <66248323+bingwang-ms@users.noreply.github.com> Date: Fri, 13 May 2022 16:30:32 +0800 Subject: [PATCH 13/60] Update control-sonic-behaviors-with-sonic-flags.md --- ...ontrol-sonic-behaviors-with-sonic-flags.md | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md b/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md index 616fbdd796..b0ecbaf9b0 100644 --- a/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md +++ b/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md @@ -1,4 +1,4 @@ -# Control SONiC behaviors with FLAGS table +# Control SONiC behaviors with SYSTEM_DEFAULTS table ## 1 Table of Content ### @@ -19,7 +19,7 @@ ## 2 Scope ## -This document covers high level design of `FLAGS` table in SONiC. +This document covers high level design of `SYSTEM_DEFAULTS` table in SONiC. ## 3 Definitions/Abbreviations ## @@ -45,23 +45,23 @@ A number of flags are required to turn on/off certain feature or control the beh ``` As a result, the `DEVICE_METADATA` table is inflating rapidly as we are having more and more flags, although these flags seem not to be categorized into `DEVICE_METADATA` -To have a better management of the flags, a new table `FLAGS` is introduced in this design. +To have a better management of the flags, a new table `SYSTEM_DEFAULTS` is introduced in this design. ## 5 Design ## ### 5.1 DB Schema -A new table `FLAGS` is added into config_db. +A new table `SYSTEM_DEFAULTS` is added into config_db. ``` - key = FLAGS + key = SYSTEM_DEFAULTS ;field = value FLAG_NAME = 1*255VCHAR ; FLAG_NAME must be unique, the value is a string, which can be 'enable'/'disable', 'down'/'up' or any string. ``` -Below is a sample of `FLAGS` table +Below is a sample of `SYSTEM_DEFAULTS` table ``` -"FLAGS": { +"SYSTEM_DEFAULTS": { "default_bgp_status": "down", "default_pfcwd_status": "enable", "synchronous_mode": "enable", @@ -69,11 +69,11 @@ Below is a sample of `FLAGS` table } ``` -### 5.2 How to update flags in `FLAGS` table +### 5.2 How to update flags in `SYSTEM_DEFAULTS` table #### 5.2.1 Set default value with `init_cfg.json` -The default value of flags in `FLAGS` table can be set in `init_cfg.json` and loaded into db at system startup. These flags are usually set at image being build, and are unlikely to change at runtime. +The default value of flags in `SYSTEM_DEFAULTS` table can be set in `init_cfg.json` and loaded into db at system startup. These flags are usually set at image being build, and are unlikely to change at runtime. If the values in `config_db.json` is changed by user, it will not be rewritten back by `init_cfg.json` as `config_db.json` is loaded after `init_cfg.json` in [docker_image_ctl.j2](https://github.com/Azure/sonic-buildimage/blob/master/files/build_templates/docker_image_ctl.j2) ``` @@ -93,24 +93,24 @@ For the flags that can be changed by reconfiguration, we can update entries in ` #### 5.2.3 Update value directly in db memory For some behavior change, we may don't have to interrupt dataplane. To support controlling SONiC behavior on-the-fly, we can update the value of flags in memory with tools like `sonic-cfggen`, `configlet` or `config apply-patch`. -### 5.3 How to consume flags in `FLAGS` table +### 5.3 How to consume flags in `SYSTEM_DEFAULTS` table #### 5.3.1 Consume at service startup or reload -All of the flags in `FLAGS` table can be consumed at service startup or reload as we do now. We can use the flags to render templates or control the running path of code. +All of the flags in `SYSTEM_DEFAULTS` table can be consumed at service startup or reload as we do now. We can use the flags to render templates or control the running path of code. #### 5.3.2 Consume on-the-fly without interrupting traffic -The `FLAGS` table can be subscribed by components that are interested on the flags. Hence, the in-memory change of flags will be consumed by running service, and take effect without reloading if possible. +The `SYSTEM_DEFAULTS` table can be subscribed by components that are interested on the flags. Hence, the in-memory change of flags will be consumed by running service, and take effect without reloading if possible. ## 6 Change required ## ### 6.1 Template update -1. Templates that generate default values in `DEVICE_METADATA|localhost` table are required to be updated. The generated flags will be put into `FLAGS` table now. +1. Templates that generate default values in `DEVICE_METADATA|localhost` table are required to be updated. The generated flags will be put into `SYSTEM_DEFAULTS` table now. 2. Templates that depend on `DEVICE_METADATA|localhost` table are required to be updated. ### 6.2 Yang model update -A new Yang model is to be added to restrict the valid flags in `FLAGS` table. The existing entries for flags in current [sonic-device_metadata.yang](https://github.com/Azure/sonic-buildimage/blob/master/src/sonic-yang-models/yang-models/sonic-device_metadata.yang) are to be removed. +A new Yang model is to be added to restrict the valid flags in `SYSTEM_DEFAULTS` table. The existing entries for flags in current [sonic-device_metadata.yang](https://github.com/Azure/sonic-buildimage/blob/master/src/sonic-yang-models/yang-models/sonic-device_metadata.yang) are to be removed. ### 6.3 Code change -1. Update `db_migrator.py` to migrate flags from `DEVICE_METADATA|localhost` table to `FLAGS` table. Current flags include +1. Update `db_migrator.py` to migrate flags from `DEVICE_METADATA|localhost` table to `SYSTEM_DEFAULTS` table. Current flags include |Flag|Source| |--|--| @@ -121,9 +121,9 @@ A new Yang model is to be added to restrict the valid flags in `FLAGS` table. Th |dhcp_server| Parse from minigraph.xml| -2. Add code to subscribe `FLAGS` table to get the update notification for components that is interested in the `FLAGS` change. Currently, all orchs and daemons don't support changing flag controlled behaviors without restarting service, so no code change is required for existing components. +2. Add code to subscribe `SYSTEM_DEFAULTS` table to get the update notification for components that is interested in the `SYSTEM_DEFAULTS` change. Currently, all orchs and daemons don't support changing flag controlled behaviors without restarting service, so no code change is required for existing components. ## 7 Test requirement TBA - \ No newline at end of file + From 50c17e0fdf06a993402f402b55ac6de366ac5abc Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Tue, 17 May 2022 02:10:58 -0400 Subject: [PATCH 14/60] Update references of /var/platform to /var/firmwareupdate to match implementation (#1000) --- doc/fwutil/fwutil.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/fwutil/fwutil.md b/doc/fwutil/fwutil.md index 82a871b569..0becc2568b 100755 --- a/doc/fwutil/fwutil.md +++ b/doc/fwutil/fwutil.md @@ -576,7 +576,7 @@ New component api is introduced to support the component firmware auto-update as """ raise NotImplementedError ``` -The return_code of auto_update_firmware() which indicates the firmware auto-update status, will be logged in "fw_au_status" under "/var/platform/" directory by fwutil and the status file will be used for the `fwutil show update status` command. +The return_code of auto_update_firmware() which indicates the firmware auto-update status, will be logged in "fw_au_status" under "/var/firmwareupdate/" directory by fwutil and the status file will be used for the `fwutil show update status` command. In case that a firmware update needs any additional step to complete the firmware update but the installation time is longer than the boot time requirement, auto-update platform api is expected to install the firmware and perform the complete action during the reboot via `platform_fw_au_reboot_handle` or `platform_reboot` plugin. For example, some cpld update needs a power cycle to complete the firmware update and some cpld update needs a register triggered power-cycle to give some refresh time for the new firmware to be effective on the system. @@ -602,7 +602,7 @@ In this example, BIOS firmware got updated, CPLD firmware got installed but powe *powercycle can be triggered by cold reboot script in this case. ```bash -admin@sonic:~/fwutil$ cat /var/platform/fw_au_status +admin@sonic:~/fwutil$ cat /var/firmwareupdate/fw_au_status { "MSN2700/BIOS": { @@ -634,7 +634,7 @@ And the components available for the update are BIOS, and SSD. In this example, BIOS firmware got updated, CPLD firmware update was skipped since the update completion can not be done for warm, and SSD firmware update is scheduled during warm boot. ```bash -admin@sonic:~/fwutil$ cat /var/platform/fw_au_status +admin@sonic:~/fwutil$ cat /var/firmwareupdate/fw_au_status { "MSN2700/BIOS": { @@ -668,9 +668,9 @@ Automatic FW installation requires default platform_components.json to be create _sonic-buildimage/device///platform_components.json_ Recommended image path is "/lib/firmware/". -Here is the /var/platform directory structure while fwutil handles the `fwutil update all fw` and `fwutil show update status` command. +Here is the /var/firmwareupdate directory structure while fwutil handles the `fwutil update all fw` and `fwutil show update status` command. ``` -/var/platform/ +/var/firmwareupdate/ |--- fw_au_status |--- _fw_au_task* ``` From f7c78fdcb6c0a45caa8d6ac081acc37253f74bbe Mon Sep 17 00:00:00 2001 From: Senthil Kumar Guruswamy <75792349+sg893052@users.noreply.github.com> Date: Tue, 17 May 2022 23:59:25 +0530 Subject: [PATCH 15/60] SYSTEM READY (#977) Support for System Ready ( Followup to #875) Repo PR title State sonic-buildimage System Ready sonic-utilities Show commands for System Ready --- .../system-ready-HLD.md | 439 ++++++++++++++++++ 1 file changed, 439 insertions(+) create mode 100644 doc/system_health_monitoring/system-ready-HLD.md diff --git a/doc/system_health_monitoring/system-ready-HLD.md b/doc/system_health_monitoring/system-ready-HLD.md new file mode 100644 index 0000000000..c55698c1ec --- /dev/null +++ b/doc/system_health_monitoring/system-ready-HLD.md @@ -0,0 +1,439 @@ + + +# System Ready HLD + +#### Rev 0.3 + +# Table of Contents + +- [List of Tables](#list-of-tables) +- [Revision](#revision) +- [Definition/Abbreviation](#definitionabbreviation) +- [About This Manual](#about-this-manual) +- [1 Introduction and Scope](#1-introduction-and-scope) + - [1.1 Limitation of Existing tools](#11-existingtools-limitation) + - [1.2 Benefits of this feature](#12-benefits-of-this-feature) +- [2 Feature Requirements](#2-feature-requirements) + - [2.1 Functional Requirements](#21-functional-requirements) + - [2.2 Configuration and Management Requirements](#22-configuration-and-management-requirements) + - [2.3 Scalability Requirements](#23-scalability-requirements) + - [2.4 Warm Boot Requirements](#24-warm-boot-requirements) +- [3 Feature Description](#3-feature-description) +- [4 Feature Design](#4-feature-design) + - [4.1 Overview](#41-design-overview) + - [4.2 Sysmonitor](#42-db-changes) + - [4.2.1 Subtasks in Sysmonitor](#421-subtasks-in-sysmonitor) + - [4.3 Service Identification](#43-service-identification) + - [4.4 System ready Framework logic](#44-systemready-fremework-logic) + - [4.5 Provision for apps to mark closest UP status](#45-provision-for-apps-to-mark-UP) + - [4.5.1 CONFIG_DB Changes](#451-config-db-changes) + - [4.5.2 STATE_DB Changes](#452-state-db-changes) + - [4.5.3 Feature yang Changes](#453-feature-yang-changes) + - [4.6 Syslogs](#46-syslogs) +- [5 CLI](#5-cli) + - [5.1 Output Format](#51-cli-output-format) + - [5.2 show system-health sysready-status](#53-system-health sysready-status) + - [5.3 show system-health sysready-status brief](#54-system-health sysready-status-brief) + - [5.4 show system-health sysready-status detail](#55-system-health sysready-status-detail) +- [6 Serviceability and Debug](#6-serviceability-and-debug) +- [7 Warm reboot Support](#7-warm-reboot-support) +- [8 Unit Test Cases ](#8-unit-test-cases) +- [9 References ](#9-references) + +# List of Tables + +[Table 1: Abbreviations](#table-1-abbreviations) + +# Revision +| Rev | Date | Author | Change Description | +|:--:|:--------:|:-----------------:|:------------------------------------------------------------:| +| 0.1 | | Senthil Kumar Guruswamy | Initial version | +| 0.2 | | Senthil Kumar Guruswamy | Update as per review comments | +| 0.3 | | Senthil Kumar Guruswamy | Integrate systemready to system-health | + + +# Definition/Abbreviation + +### Table 1: Abbreviations + +| **Term** | **Meaning** | +| -------- | ----------------------------------------- | +| FEATURE | Docker/Service | +| App | Docker/Service | + + +# About this Manual + +This document provides general information about the System Ready feature implementation in SONiC. + + +# 1 Introduction and Scope + +This document describes the Functionality and High level design of the System Ready feature. + +At present, there is no mechanism to know that the system is up and ready with all the essential sonic services and also, all the docker apps are ready along with port ready status to start the network traffic. +With the asynchronous architecture of SONiC, we will not be able to verify if the config has been applied all the way down to the hardware. +However, if we could get the closest up status of each docker app considering their config receive ready and port ready, the system readiness could be arrived. + +A new python based System monitor tool is introduced to monitor all the essential system host services including docker wrapper services on an event based model and declare the system is ready. +This framework gives provision for docker apps to notify its closest up status. +CLIs are provided to fetch the current system status and also service running status and its app ready status along with failure reason if any. +This feature will be part of system-health framework. + +## 1.1 Limitation of Existing tools: + - Monit tool is a poll based approach which monitors the configured services for every 1 minute. + - Container_checker in monit checks only for running status of expected containers. + - Monits custom script execution can only run a logic to take some action but it is yet again a poll based approach. + + +## 1.2 Benefits of this feature: + - Event based model where the feedback is immediate + - Know the overall system status through syslog and as well through CLIs + - It brings in the concept of application readiness to allow each application/service/docker to declare themselves as ready based on different application specific criteria. + - Combatibility with application extension framework. + SONiC package installation process will register new feature in CONFIG DB. + Third party dockers(signature verified) gets integrated into sonic os and runs similar to the existing dockers accessing db etc. + Now, once the feature is enabled, it becomes part of either sonic.target or multi-user.target and when it starts, it automatically comes under the system monitor framework watchlist. + Hence any third party docker needs to follow the framework logic by including "check_up_status" field in their manifest json file while registering itself in CONFIG_DB and also make use of the provision given to docker apps to mark its closest up status in STATE_DB. + + +# 2 Feature Requirements + +## 2.1 Functional Requirements + +Following requirements are addressed by the design presented in this document: + +1. Identify the list of sonic services to be monitored. +2. system-health to include the sysmon framework to check system status of all the service units and receive service state change notifications to declare the system ready status. +3. Provision for apps to notify its closest up status in STATE DB. This should internally cover Port ready status. Also support application extension framework. +4. Appropriate system ready syslogs to be raised. +5. New CLI to be introduced to know the current system status all services. + - "show system-health sysready-status" covers the overall system status. +6. During the techsupport data collection, the new CLI to be included for debugging. + + +## 2.2 Configuration and Management Requirements + +This feature will support CLI and no configuration command is provided for any congiruations. + + +## 2.3 Scalability Requirements + +NA + +## 2.4 Warm Boot Requirements + +warmboot-finalizer sonic service to be monitored as part of all services. + + +# 3 Feature Description + +This feature provides framework to determine the current system status to declare the system is (almost) ready for network traffic. + +System ready is arrived at considering the following factors. +1. All sonic docker services and its UP status(including Portready status) +2. All sonic host services + + +# 4 Feature Design +## 4.1 Design Overview + +- System-health's newly introduced sysmonitor subtask tracks the sonic host service list, all the docker wrapper services for their running status and also, their app ready status including portready and declare the system is ready. +- When sysmonitor daemon boots up, it polls for the service list status once and maintains the operational data in STATE_DB and publishes the system ready status in form of syslog and as well as in STATE_DB. +- Subsequently, when any service state changes, sysmonitor gets the event notification for that service to be checked for its status and update the STATE_DB promptly. +- Hence the system status is always up-to-date to be notifed to user in the form of syslog, STATE_DB update and as well as could be fetched by appropriate CLIs. + + +## 4.2 Sysmonitor + +Sysmonitor is the subtask of system-health service which does the job of checking the service status and updating the system readiness. + +### 4.2.1 Subtasks in Sysmonitor + +1. subscribe to system dbus + - With the dbus subscription, any systemd events gets notified to this task and it puts the event in the multiprocessing queue. + +2. subscribe to the new FEATURE table in STATE_DB of Redis database + - With the STATE_DB feature table subscription, any input to the FEATURE table gets notified to this task and it puts the event in the queue. + +3. Main task + - Runs through the polling of all service status check once and listen for events in queue populated by dbus task and statedb task to take appropriate action of checking the specific event unit status + and updating system status in the STATE_DB. + + + +## 4.3 Service Identification + +- It covers the enabled services from FEATURE table of CONFIG_DB. +- Also, since the idea is to cover only the sonic services but not the general system services, sysmonitor tracks services under "multi-user.target" and "sonic.target" +- This covers all the sonic docker services and most of the sonic host services. + + +## 4.4 System ready Framework logic + +The system ready framework design should just not only display the current status of the services in the system +but align the services within framework to flag the status as "Down" if the service is not running when it was intended to be running. + +- For services: + - Loaded, enabled/enabled-runtime/static, active & running, active & exited state services are considered 'OK'. + - For active and running services, up_status marked by docker app should be True to be considered 'OK'. + - Failed state services are considered 'Down'. + - Activating state services are considered as 'Starting'. + - Deactivating state services are considered as 'Stopping'. + - Inactive state services category: + - oneshot services are considered as 'OK'. + - Special services with condition pathexists check failure are considered as 'OK'. + - Other services in inactive state are considered to be 'Down'. + - Any service type other than oneshot if by default goes to inactive state, RemainAfterExit=yes entry needs to be added to their service unit file to be inline with the framework. + + +## 4.5 Provision for apps to mark closest UP status + +The feature provides framework for services to mark its closest UP status. +In simple, each app is responsible in marking its closest up status in STATE_DB. Sysmonitor tool just reads from it. + +### 4.5.1 CONFIG_DB Changes (init_cfg.json) + +Docker apps marking their UP status in STATE_DB will input an entry in FEATURE table of CONFIG_DB with check_up_status flag set to true through /etc/sonic/init_cfg.json file change. +Sysmonitor checks for the check_up_status flag in CONFIG_DB before reading the app ready status from STATE_DB. +If the flag does not exist or if set to False, then sysmonitor will not read the app ready status but just checks the running status of the service. + +For application extension package support, +a new manifest variable is introduced to control whether "check_up_status" should be up true or false which will also be an indication whether docker implements marking the up_status flag in STATE_DB. + +``` +- Schema in /etc/sonic/init_cfg.json + This json file will be fed to FEATURE table of CONFIG_DB during bootup. + This json file will be factory default and no config command will be provided for "check_up_status" entry to be updated in CONFIG_DB later. + { + "FEATURE": { + "": { + ... + "state": "enabled", + "check_up_status": "true" + } + } + } +``` + +### 4.5.2 STATE_DB Changes +- Docker apps which rely on config, can mark 'up_status' to true in STATE_DB when they are ready to receive configs from CONFIG_DB and/or some extra dependencies are met. +- Respective apps should mark its up_status considering Port ready status. Hence there is no separate logic check needed by system monitoring tool +- Any docker app which has multiple independent daemons can maintain a separate intermediate key-value in the redis-db for each of the daemons and the startup script that invokes each of these daemons can determine the status from the redis entries by each daemon and finally update the STATE_DB up_status. +- Along with up_status, docker apps should update the fail_reason field with appropriate reason in case of failure or empty string in case of success. +- Also, update_time field to be fed in as well in the format of epoch time. + + +For instances, +- swss docker app can wait for port init done and wait for Vrfmgr, Intfmgr and Vxlanmgr to be ready before marking its up status. +- Other apps like udld,stp etc once after waiting for PortInitDone status and interface db creation, they could mark their UP status. +- Database app which is the first/base app to be up, may set the UP_STATUS to True once all the required number of redis-server instances are in running state. + However, as the supervisor monitors all the redis db instances as part of critical process list, there is no need of a separate app ready status in database docker. + + +STATE_DB: +``` +- sonic-db-cli STATE_DB HSET "FEATURE|" up_status true +- sonic-db-cli STATE_DB HSET "FEATURE|" fail_reason "" / "" +- sonic-db-cli STATE_DB HSET "FEATURE|" update_time "" + +- Schema in STATE_DB + sonic-db-dump -n STATE_DB output + "FEATURE|": { + "type": "hash", + "value": { + "up_status": "true", + "fail_reason": "", + "update_time": "" + + } + }, + +- Example: + "FEATURE|bgp": { + "type": "hash", + "value": { + "fail_reason": "", + "update_time": "1634119649.7268105", + "up_status": "true" + } + }, + +``` + + +In addition to this, sysmonitor posts the system status to SYSTEM_READY table in STATE_DB as below. + +``` + "SYSTEM_READY|SYSTEM_STATE": { + "type": "hash", + "value": { + "status": "up" + } + } +``` + +### 4.5.3 Feature yang Changes + +Following field is added to the sonic-feature.yang file. + +``` +container sonic-feature { + + container FEATURE { + + ... + + leaf check_up_status { + description "This configuration controls the system ready tool to check + the app ready/up status"; + type boolean; + default false; + } + } +} +``` + +## 4.6 Syslogs: + +- Syslog to be generated for any Sonic systemd services that changes event(active/inactive) +- A dedicated task in sysmonitor runs to listen for any service state change events. + Upon receiving any state change events, the task check for its status and identify the particular event service that caused the change and raise a syslog for that service. +- syslog is generated for "System is ready" and "System is not ready - One or more services are not up" scenario, only when there is a change between the two states. + +``` +Example 1: + Jul 02 11:53:51.020133 2021 sonic INFO system#monitor: System is not ready + Jul 02 11:53:51.020133 2021 sonic INFO system#monitor: System is not ready - one or more services are not up + +Example 2: + Jul 02 17:01:00.454978 2021 sonic INFO system#monitor: pmon.service service state changed to [inactive/dead] + Jul 02 17:01:28.725101 2021 sonic INFO system#monitor: pmon.service service state changed to [active/running] +``` + +## 5 CLI: + +Only Click command is supported and not KLISH commands as KLISH will not work if Mgmt-framework service is down. +- show system-health sysready-status + + +### 5.1 Output Format: + 1. Short message indicating system is ready or not + 2. Header - Service-Name, Service-Status, App-Ready-Status, Down-Reason + 3. List of servies and it status values + 4. Output Strings for Service-Status and App-Ready-Status: + "OK" - when a service is up + "Down" - to emphasise a service is not running when it was intended to be running. + "Starting" - Initializing + "Stopping" - Deactivating + 5. Down-Reason will be extracted from "Result" property of systemctl command and then displayed appropriately. + Different reasons can be: + start-limit-hit + exit-code + Inactive + custom strings from apps + +``` + <"System is ready"/"System is not ready - one or more services are not up"> + Service-Name Service-Status App-Ready-Status Down-Reason + OK OK - + Down Down start-limit-hit + OK Down Inactive +``` + + +### 5.2 show system-health sysready-status + +``` + root@sonic:/# show system-health sysready-status + System is ready + + Service-Name Service-Status App-Ready-Status Down-Reason + as7712-pddf-platform-monitor OK OK - + bgp OK OK - + caclmgrd OK OK - + config-setup OK OK - + containerd OK OK - + + root@sonic:/# show system-health sysready-status + System is not ready - one or more services are not up + + Service-Name Service-Status App-Ready-Status Down-Reason + aaastatsd Down Down start-limit-hit + as7712-pddf-platform-monitor OK OK - + bgp OK Starting - + caclmgrd OK OK - + config-setup OK OK - + ntp-config Starting Starting - + pmon OK Down Transceiver daemon is not up +``` + +### 5.3 show system-health sysready-status brief +- The output of this command will just display the brief status of the entire sonic services. +- Output format of the CLI : + +``` + <"System is ready"/"System is not ready - one or more services are not up"> + + Example 1: + root@sonic:/# show system-health sysready-status brief + System is not ready - one or more services are not up + + root@sonic:/# +``` + +### 5.4 show system-health sysready-status detail +- The output of this command will display AppStatus-UpdateTime column in addition to the existing to give more info on the time the app readiness was marked. +- Output format of the CLI : + +``` + <"System is ready"/"System is not ready - one or more services are not up"> + Service-Name Service-Status App-Ready-Status Down-Reason AppStatus-UpdateTime + -------------------------------- ---------------- ------------------ ------------- ---------------------- + as7326-56x-pddf-platform-monitor OK OK - - + + + Example 1: + root@sonic:/# show system-health sysready-status detail + System is not ready - one or more services are not up + + Service-Name Service-Status App-Ready-Status Down-Reason AppStatus-UpdateTime + -------------------------------- ---------------- ------------------ ------------- ---------------------- + as7326-56x-pddf-platform-monitor OK OK - - + auditd OK OK - - + bgp OK OK - - + caclmgrd OK OK - - + config-chassisdb OK OK - - + + + root@sonic:/# +``` + +## 6 Serviceability and Debug + +- The system logging mechanisms explained in section 4.6 shall be used. +- The show commands can be used as debug aids. +- Techsupport: + In generate dump tool, show system-health sysready-status detail CLI is included to be saved to the dump in the name of system-health-sysready.status + + + +## 7 Warm Reboot Support + +Sysmonitor monitors the running status of warmboot-finalizer.service +This can be enhanced to hook to the actual completion of warboot-finalizer service later. + + +## 8 Unit Test Cases + +1. Check show system-health sysready-status +2. Check show system-health sysready-status brief +3. Check show system-health sysready-status detail +4. Make any of the docker apps down and check failed apps details are shown +5. Make any of the host apps down and check failed apps details are shown +6. Check top command for sysmonitor CPU and memory usage +7. Check syslogs for any service state change. +8. Check syslog for overall system status change. + +## 9 References +NA From 64377527722348fb19cbd49c9dc4a67a73b8e252 Mon Sep 17 00:00:00 2001 From: kannankvs Date: Wed, 18 May 2022 11:07:55 +0530 Subject: [PATCH 16/60] Updated the build image link for commit diff (#1003) As discussed, we have updated the build image with commit diff details for all the builds generated. --- generate_sonic_image_links.sh | 40 +++++++++++++++++++++++++++++++++++ sonic_latest_images.html | 20 +++++++++++------- 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/generate_sonic_image_links.sh b/generate_sonic_image_links.sh index aae526e660..6063b5fa23 100644 --- a/generate_sonic_image_links.sh +++ b/generate_sonic_image_links.sh @@ -7,6 +7,9 @@ git pull origin sonic_latest_images_links #set -euo pipefail + +DEFID_BRCM_CMT="$(curl -s 'https://sonic-build.azurewebsites.net/ui/sonic/pipelines/138/builds?branchName=master' | jq -r '.value[0].id')" + DEFID_BRCM="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/definitions?name=Azure.sonic-buildimage.official.broadcom' | jq -r '.value[0].id')" DEFID_MLNX="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/definitions?name=Azure.sonic-buildimage.official.mellanox' | jq -r '.value[0].id')" DEFID_VS="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/definitions?name=Azure.sonic-buildimage.official.vs' | jq -r '.value[0].id')" @@ -67,82 +70,118 @@ do ARTF_MRV="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds/'"${BUILD_MRV}"'/artifacts?artifactName=sonic-buildimage.marvell-armhf&api-version=5.1' | jq -r '.resource.downloadUrl')" ARTF_NPH="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds/'"${BUILD_NPH}"'/artifacts?artifactName=sonic-buildimage.nephos&api-version=5.1' | jq -r '.resource.downloadUrl')" + COMMIT_BRCM_1="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_BRCM}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[0].sourceVersion')" + COMMIT_BRCM_2="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_BRCM}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[1].sourceVersion')" + COMMIT_MLNX_1="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_MLNX}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[0].sourceVersion')" + COMMIT_MLNX_2="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_MLNX}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[1].sourceVersion')" + COMMIT_VS_1="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_VS}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[0].sourceVersion')" + COMMIT_VS_2="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_VS}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[1].sourceVersion')" + COMMIT_INNO_1="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_INNO}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[0].sourceVersion')" + COMMIT_INNO_2="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_INNO}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[1].sourceVersion')" + COMMIT_BFT_1="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_BFT}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[0].sourceVersion')" + COMMIT_BFT_2="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_BFT}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[1].sourceVersion')" + COMMIT_CHE_1="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_CHE}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[0].sourceVersion')" + COMMIT_CHE_2="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_CHE}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[1].sourceVersion')" + COMMIT_CTC_1="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_CTC}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[0].sourceVersion')" + COMMIT_CTC_2="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_CTC}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[1].sourceVersion')" + COMMIT_CTC64_1="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_CTC64}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[0].sourceVersion')" + COMMIT_CTC64_2="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_CTC64}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[1].sourceVersion')" + COMMIT_GRC_1="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_GRC}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[0].sourceVersion')" + COMMIT_GRC_2="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_GRC}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[1].sourceVersion')" + COMMIT_MRV_1="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_MRV}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[0].sourceVersion')" + COMMIT_MRV_2="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_MRV}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[1].sourceVersion')" + COMMIT_NPH_1="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_NPH}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[0].sourceVersion')" + COMMIT_NPH_2="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/builds?definitions='"${DEFID_NPH}"'&branchName=refs/heads/'"${BRANCH}"'&$top=2&resultFilter=succeeded&api-version=6.0' | jq -r '.value[1].sourceVersion')" + echo "\"${BRANCH}\": {" >> sonic_image_links.json echo "\"sonic-broadcom.bin\": {" >> sonic_image_links.json echo " \"url\": \"$(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')\"," >> sonic_image_links.json echo " \"build-url\": \"https://dev.azure.com/mssonic/build/_build/results?buildId=${BUILD_BRCM}&view=results\"," >> sonic_image_links.json + echo " \"diff\": \"https://github.com/Azure/sonic-buildimage/compare/"${COMMIT_BRCM_2}"..."${COMMIT_BRCM_1}"\"," >> sonic_image_links.json echo " \"build\": \"${BUILD_BRCM}\"," >> sonic_image_links.json echo " \"date\": \"${BUILD_BRCM_TS}\"" >> sonic_image_links.json echo " }," >> sonic_image_links.json echo "\"sonic-aboot-broadcom.swi\": {" >> sonic_image_links.json echo " \"url\": \"$(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-aboot-broadcom.swi/')\"," >> sonic_image_links.json echo " \"build-url\": \"https://dev.azure.com/mssonic/build/_build/results?buildId=${BUILD_BRCM}&view=results\"," >> sonic_image_links.json + echo " \"diff\": \"https://github.com/Azure/sonic-buildimage/compare/"${COMMIT_BRCM_2}"..."${COMMIT_BRCM_1}"\"," >> sonic_image_links.json echo " \"build\": \"${BUILD_BRCM}\"," >> sonic_image_links.json echo " \"date\": \"${BUILD_BRCM_TS}\"" >> sonic_image_links.json echo " }," >> sonic_image_links.json echo "\"sonic-mellanox.bin\": {" >> sonic_image_links.json echo " \"url\": \"$(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')\"," >> sonic_image_links.json echo " \"build-url\": \"https://dev.azure.com/mssonic/build/_build/results?buildId=${BUILD_MLNX}&view=results\"," >> sonic_image_links.json + echo " \"diff\": \"https://github.com/Azure/sonic-buildimage/compare/"${COMMIT_MLNX_2}"..."${COMMIT_MLNX_1}"\"," >> sonic_image_links.json echo " \"build\": \"${BUILD_MLNX}\"," >> sonic_image_links.json echo " \"date\": \"${BUILD_MLNX_TS}\"" >> sonic_image_links.json echo " }," >> sonic_image_links.json echo "\"sonic-vs.img.gz\": {" >> sonic_image_links.json echo " \"url\": \"$(echo "${ARTF_VS}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-vs.img.gz/')\"," >> sonic_image_links.json echo " \"build-url\": \"https://dev.azure.com/mssonic/build/_build/results?buildId=${BUILD_VS}&view=results\"," >> sonic_image_links.json + echo " \"diff\": \"https://github.com/Azure/sonic-buildimage/compare/"${COMMIT_VS_2}"..."${COMMIT_VS_1}"\"," >> sonic_image_links.json echo " \"build\": \"${BUILD_VS}\"," >> sonic_image_links.json echo " \"date\": \"${BUILD_VS_TS}\"" >> sonic_image_links.json echo " }," >> sonic_image_links.json echo "\"sonic-innovium.bin\": {" >> sonic_image_links.json echo " \"url\": \"$(echo "${ARTF_INNO}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-innovium.bin/')\"," >> sonic_image_links.json echo " \"build-url\": \"https://dev.azure.com/mssonic/build/_build/results?buildId=${BUILD_INNO}&view=results\"," >> sonic_image_links.json + echo " \"diff\": \"https://github.com/Azure/sonic-buildimage/compare/"${COMMIT_INNO_2}"..."${COMMIT_INNO_1}"\"," >> sonic_image_links.json echo " \"build\": \"${BUILD_INNO}\"," >> sonic_image_links.json echo " \"date\": \"${BUILD_INNO_TS}\"" >> sonic_image_links.json echo " }," >> sonic_image_links.json echo "\"sonic-innovium-dbg.bin\": {" >> sonic_image_links.json echo " \"url\": \"$(echo "${ARTF_INNO}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-innovium-dbg.bin/')\"," >> sonic_image_links.json echo " \"build-url\": \"https://dev.azure.com/mssonic/build/_build/results?buildId=${BUILD_INNO}&view=results\"," >> sonic_image_links.json + echo " \"diff\": \"https://github.com/Azure/sonic-buildimage/compare/"${COMMIT_INNO_2}"..."${COMMIT_INNO_1}"\"," >> sonic_image_links.json echo " \"build\": \"${BUILD_INNO}\"," >> sonic_image_links.json echo " \"date\": \"${BUILD_INNO_TS}\"" >> sonic_image_links.json echo " }," >> sonic_image_links.json echo "\"sonic-barefoot.bin\": {" >> sonic_image_links.json echo " \"url\": \"$(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-barefoot.bin/')\"," >> sonic_image_links.json echo " \"build-url\": \"https://dev.azure.com/mssonic/build/_build/results?buildId=${BUILD_BFT}&view=results\"," >> sonic_image_links.json + echo " \"diff\": \"https://github.com/Azure/sonic-buildimage/compare/"${COMMIT_BFT_2}"..."${COMMIT_BFT_1}"\"," >> sonic_image_links.json echo " \"build\": \"${BUILD_BFT}\"," >> sonic_image_links.json echo " \"date\": \"${BUILD_BFT_TS}\"" >> sonic_image_links.json echo " }," >> sonic_image_links.json echo "\"sonic-centec.bin\": {" >> sonic_image_links.json echo " \"url\": \"$(echo "${ARTF_CTC}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-centec.bin/')\"," >> sonic_image_links.json echo " \"build-url\": \"https://dev.azure.com/mssonic/build/_build/results?buildId=${BUILD_CTC}&view=results\"," >> sonic_image_links.json + echo " \"diff\": \"https://github.com/Azure/sonic-buildimage/compare/"${COMMIT_CTC_2}"..."${COMMIT_CTC_1}"\"," >> sonic_image_links.json echo " \"build\": \"${BUILD_CTC}\"," >> sonic_image_links.json echo " \"date\": \"${BUILD_CTC_TS}\"" >> sonic_image_links.json echo " }," >> sonic_image_links.json echo "\"sonic-centec-arm64.bin\": {" >> sonic_image_links.json echo " \"url\": \"$(echo "${ARTF_CTC64}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-centec-arm64.bin/')\"," >> sonic_image_links.json echo " \"build-url\": \"https://dev.azure.com/mssonic/build/_build/results?buildId=${BUILD_CTC64}&view=results\"," >> sonic_image_links.json + echo " \"diff\": \"https://github.com/Azure/sonic-buildimage/compare/"${COMMIT_CTC64_2}"..."${COMMIT_CTC64_1}"\"," >> sonic_image_links.json echo " \"build\": \"${BUILD_CTC64}\"," >> sonic_image_links.json echo " \"date\": \"${BUILD_CTC64_TS}\"" >> sonic_image_links.json echo " }," >> sonic_image_links.json echo "\"sonic-generic.bin\": {" >> sonic_image_links.json echo " \"url\": \"$(echo "${ARTF_GRC}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-generic.bin/')\"," >> sonic_image_links.json echo " \"build-url\": \"https://dev.azure.com/mssonic/build/_build/results?buildId=${BUILD_GRC}&view=results\"," >> sonic_image_links.json + echo " \"diff\": \"https://github.com/Azure/sonic-buildimage/compare/"${COMMIT_GRC_2}"..."${COMMIT_GRC_1}"\"," >> sonic_image_links.json echo " \"build\": \"${BUILD_GRC}\"," >> sonic_image_links.json echo " \"date\": \"${BUILD_GRC_TS}\"" >> sonic_image_links.json echo " }," >> sonic_image_links.json echo "\"sonic-generic-dbg.bin\": {" >> sonic_image_links.json echo " \"url\": \"$(echo "${ARTF_GRC}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-generic-dbg.bin/')\"," >> sonic_image_links.json echo " \"build-url\": \"https://dev.azure.com/mssonic/build/_build/results?buildId=${BUILD_GRC}&view=results\"," >> sonic_image_links.json + echo " \"diff\": \"https://github.com/Azure/sonic-buildimage/compare/"${COMMIT_GRC_2}"..."${COMMIT_GRC_1}"\"," >> sonic_image_links.json echo " \"build\": \"${BUILD_GRC}\"," >> sonic_image_links.json echo " \"date\": \"${BUILD_GRC_TS}\"" >> sonic_image_links.json echo " }," >> sonic_image_links.json echo "\"sonic-marvell-armhf.bin\": {" >> sonic_image_links.json echo " \"url\": \"$(echo "${ARTF_MRV}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-marvell-armhf.bin/')\"," >> sonic_image_links.json echo " \"build-url\": \"https://dev.azure.com/mssonic/build/_build/results?buildId=${BUILD_MRV}&view=results\"," >> sonic_image_links.json + echo " \"diff\": \"https://github.com/Azure/sonic-buildimage/compare/"${COMMIT_MRV_2}"..."${COMMIT_MRV_1}"\"," >> sonic_image_links.json echo " \"build\": \"${BUILD_MRV}\"," >> sonic_image_links.json echo " \"date\": \"${BUILD_MRV_TS}\"" >> sonic_image_links.json echo " }," >> sonic_image_links.json echo "\"sonic-nephos.bin\": {" >> sonic_image_links.json echo " \"url\": \"$(echo "${ARTF_NPH}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-nephos.bin/')\"," >> sonic_image_links.json echo " \"build-url\": \"https://dev.azure.com/mssonic/build/_build/results?buildId=${BUILD_NPH}&view=results\"," >> sonic_image_links.json + echo " \"diff\": \"https://github.com/Azure/sonic-buildimage/compare/"${COMMIT_NPH_2}"..."${COMMIT_NPH_1}"\"," >> sonic_image_links.json echo " \"build\": \"${BUILD_NPH}\"," >> sonic_image_links.json echo " \"date\": \"${BUILD_NPH_TS}\"" >> sonic_image_links.json echo " }" >> sonic_image_links.json @@ -153,3 +192,4 @@ echo "\n}" >> sonic_image_links.json git add sonic_image_links.json git commit -m "latest links for sonic images in dedicated branch sonic_latest_images_links" git push -f --set-upstream origin sonic_latest_images_links + diff --git a/sonic_latest_images.html b/sonic_latest_images.html index 5636a5f36f..ddae784c35 100644 --- a/sonic_latest_images.html +++ b/sonic_latest_images.html @@ -1,3 +1,4 @@ + @@ -33,7 +34,7 @@
- SONiC logo + SONiC logo
@@ -67,7 +68,6 @@

Latest Successful Builds

- NOTE: The 5 digit number given in the cells specifies the build Id of the images.

click here for previous builds
@@ -80,7 +80,7 @@

Latest Successful Builds

- + \ No newline at end of file From 7def9117f8ec8ba4330519729700fc5962ece5c9 Mon Sep 17 00:00:00 2001 From: bingwang Date: Wed, 18 May 2022 15:10:46 +0000 Subject: [PATCH 17/60] Add an example Signed-off-by: bingwang --- ...ontrol-sonic-behaviors-with-sonic-flags.md | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md b/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md index b0ecbaf9b0..51015a5fe8 100644 --- a/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md +++ b/doc/sonic-flags/control-sonic-behaviors-with-sonic-flags.md @@ -53,19 +53,28 @@ To have a better management of the flags, a new table `SYSTEM_DEFAULTS` is intro A new table `SYSTEM_DEFAULTS` is added into config_db. ``` - key = SYSTEM_DEFAULTS + key = SYSTEM_DEFAULTS|feature_name; feature name must bt unique ;field = value - FLAG_NAME = 1*255VCHAR ; FLAG_NAME must be unique, the value is a string, which can be 'enable'/'disable', 'down'/'up' or any string. + status = 1*255VCHAR ; The value is a string, which can be 'enable'/'disable', 'down'/'up' or any string. + custom_field = 1*255VCHAR ; The name of custom_field can be any custom string. ``` Below is a sample of `SYSTEM_DEFAULTS` table ``` "SYSTEM_DEFAULTS": { - "default_bgp_status": "down", - "default_pfcwd_status": "enable", - "synchronous_mode": "enable", - "dhcp_server": "enable" + "tunnel_qos_remap": { + "status": "enabled" + } + "default_bgp_status": { + "status": "down" + } + "synchronous_mode": { + "status": "enable" + } + "dhcp_server": { + "status": "enable" + } } ``` @@ -89,7 +98,19 @@ For example, the value of `default_bgp_status` is down in `init_cfg.json` if `sh #### 5.2.2 Parse from `minigraph.xml` when loading minigraph For the flags that can be changed by reconfiguration, we can update entries in `minigraph.xml`, and parse the new values in to config_db with minigraph parser at reloading minigraph. +For example, to turn on/off the `tunnel_qos_remap` feature, a new section will be defined in `minigraph.xml` +``` + + + + TunnelQosRemapEnabled + True + + + +``` +The new section will be parsed by `minigraph.py`, and the parsed value will be merged with the values defined in `init_cfg.json`, and finally written into `config_db`. If there are duplicated entries in `init_cfg.json` and `minigraph.xml`, the values in `minigraph.xml` will overwritten the values defined in `init_cfg.json`. #### 5.2.3 Update value directly in db memory For some behavior change, we may don't have to interrupt dataplane. To support controlling SONiC behavior on-the-fly, we can update the value of flags in memory with tools like `sonic-cfggen`, `configlet` or `config apply-patch`. From 6b33a02f032b79e353cd9df47f88a4620f7737a0 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Mon, 23 May 2022 08:57:35 -0700 Subject: [PATCH 18/60] draft --- doc/dualtor/active_active_hld.md | 130 +++++++++++++++++++++++++ doc/dualtor/image/cluster_topology.png | Bin 0 -> 25023 bytes doc/dualtor/image/icmp_format.png | Bin 0 -> 2149 bytes doc/dualtor/image/icmp_payload.png | Bin 0 -> 2468 bytes 4 files changed, 130 insertions(+) create mode 100644 doc/dualtor/active_active_hld.md create mode 100644 doc/dualtor/image/cluster_topology.png create mode 100644 doc/dualtor/image/icmp_format.png create mode 100644 doc/dualtor/image/icmp_payload.png diff --git a/doc/dualtor/active_active_hld.md b/doc/dualtor/active_active_hld.md new file mode 100644 index 0000000000..a55959a8cd --- /dev/null +++ b/doc/dualtor/active_active_hld.md @@ -0,0 +1,130 @@ +# Active-Active Dual ToR + +Active-active dual ToR link manager is an evolution of active-standby dual ToR link manager. Both ToRs are expected to handle traffic in normal scenarios. For consistency, we will keep using the term "standby" to refer inactive links or ToRs. + +## Revision + +| Rev | Date | Author | Change Description | +|:---:|:--------:|:---------------:|--------------------| +| 0.1 | 05/23/22 | | Initial version | + +## Scope +This document provides the high level design of SONiC dual toR solution supporting active-active setup. + +## Server Network Interface Card (NIC) Infomation +Server NIC will be deployed on Gen 9 Cluster Design. Each server will have a NIC will have 2 x 100Gbps uplinks. These uplinks will be connected to 2 different ToRs with Direct Attach Copper (DAC) Cable. + +## Top of Rack (ToR) Information +To support active-active, the ToR must be running SONiC. The hardware is a 32 or 64 port x 100G device. Note with Gen 9 Cluster, the ToR and T1 port speed will be still on 100Gbps. + +Two DAC cables will be used to connect the Server NIC and 2 ToRs. No Y-cable is needed. + + +## Cluster Topology +There are a certain number of racks in a row, each rack will have 2 ToRs, and each row will have 8 Tier One (T1s) network devices. Each server will have a NIC connected to 2 ToRs with 100 Gbps DAC cables. + +In this design: +* Both upper ToR (labeled as UT0) and lower ToR (labeled as LT0) will advertise same VLAN to upstream T1s, each T1 will see 2 available next hops for the VLAN. +* Both UT0 and LT0 are expected to carry traffic in normal scenarios. +* The software stack on server host will see 200 Gbps NIC. + +![image info](./image/cluster_topology.png) + +### Bandwidth +Each ToR will have single port-channel to each T1. The port-channel will have 2 members of 100Gbps. Therefore, each T0 will have total of 8\*2\*100 Gbps = 1.6 Tbps to all T1s. + +T1s will have 8 uplinks to T2s. Therefore, total T1s uplink will be 64. Total uplink bandwidth is 6.4Tbps. + + +## SONiC ToR Controlled Solution +### IP Routing +Normal Scenario +Both T0s are up and functioning and both the server NIC connections are up and functioning. +* Control Plane + UT0 and LT0 will advertise same VLAN (IPv4 and IPv6) to upstream T1s. Each T1 will see there are 2 available next hops for the VLAN. T1s advertise to T2 as normal. +* Data Plane + * Traffic to the server + * Traffic lands on any of the T1 by ECMP from T2s. + * T1 forwards traffic to either of the T0s by ECMP. + * T0 sends the traffic to the server. + * Traffic from the server to outside the cluster + * NIC determines which link to use and sends all the packets on a flow using the same link. + * T0 sends the traffic to the T1 by ECMP. + * Traffic from the server to within the cluster + * NIC determines which link to use and sends all the packet on a flow using the same link. + * T0 sends the traffic to destination server if T0 has learn the MAC address of the destination server. + +Server Uplink Issue +Both T0s are up and functioning and some servers NIC are only connected to 1 ToR (due to cable issue, or the cable is taken out for maintenance). +* Control Plane +No change from the normal case. +* Data Plane + * Traffic to the server + * Traffic lands on any of the T1 by ECMP from T2s. + * T1 forwards traffic to either of the T0s by ECMP. + * If T0 does not have the downlink to the server, T0 will send the traffic to the peer T0 over VxLAN encap via T1s. + * T0 sends the traffic to the server. + * Traffic from the server to outside the cluster + * T0 will signal to NIC which side to use. + * NIC determines which link to use and sends all the packets on a flow using the same link. If server NIC has only 1 connection up, all traffic will be on this connection. + * T0 sends the traffic to the T1 by ECMP + * Traffic from the server to within the cluster + * T0 will signal to NIC which side to use. + * NIC determines which link to use and sends all the packets on a flow using the same link. If Server NIC has only 1 connection up, all traffic will be on this connection + * If T0 does not have the downlink to the server, T0 will send the traffic to the peer T0 over VxLAN encap via T1s. + * T0 sends the traffic to the server. + +ToR Failure +Only 1 T0s is up and functioning and both the server NIC connections are up and functioning. +* Control Plane +Only 1 T0 will advertise the VLAN (IPv4 and v6) to upstream T1s. +* Data Plane + * Traffic to the server + * Traffic lands on any of the T1 by ECMP from T2s. + * T1 forwards traffic to either of the T0s by ECMP. If one T0 is down, T1 forwards traffic to the healthy one. + * T0 sends the traffic to the server. + * Traffic from the server to outside the cluster + * T0 will signal to NIC which side to use. + * T0 sends the traffic to the T1 by ECMP. + * Traffic from the server to within the cluster + * T0 will signal to NIC which side to use. + * T0 sends the traffic to the server. + +Highlight on the difference with Active-Standby: +1. In active-standby dual ToR design, traffic from server is duplicate to both T0s, standby ToR needs to drop the packets. In active-active, NIC will determine which link to use if both are available. +1. In active-ative design, servers have up to 2 links for traffic, T1s and above devices will see more throughput from server. + +### Linkmgrd +Linkmgrd will provide the determination of a ToR / link's readiness for use. + +### Requirement +1. Introduce active-active mode into MUX state machine. +1. Probe to determine if link is healthy or not. +1. Signal NIC if ToR is switching active or standby. +1. Rescue when peer ToR failure occures. +1. Unblock traffic when cable control channel is unreachable. + +### Solution +* Link Prober + Linkmgrd will keep the link prober design from active-standby mode for monitoring link health status. Link prober will send ICMP packets and listen to ICMP response packets. ICMP packets will contain payload information about the ToR. ICMP replies will be duplicated to both ToRs from the server, hence a ToR can monitor the health status of its peer ToR as well. + + ICMP Probing Format + The source MAC will be ToR's SVI mac address. Ethernet destination will be the well-known MAC address. Source IP will be ToR's Loopback IP, destination IP will be SoC's IP address, which will be introduced as a field in minigraph. + ![image info](./image/icmp_format.png) + Linkmgrd also adapt TLV (Type-Length-Value) as the encoding schema in payload for additional information elements, including cookie, version, ToR GUID etc. + ![image info](./image/icmp_payload.png) + + ... ... + +* Link State + When link is down, linkmgrd will receive notification based on kernel message from netlink. This notification will be used to determine if ToR is healthy. + +* Cable Control through gRPC + In active-active design, we will use gRPC to do cable control and signal NIC if ToRs is up active. SoC will run a gRPC server. Linkmgrd will determine server side forwarding sate based on link prober status and link state. Then linkmgrd can invoke transceiver daemon to update NIC if ToRs are active through gRPC calls. + +* Default gateway to T1 + If default gateway to T1 is missing, dual ToR system can suffer from northbound packet loss, hence linkmgrd also monitors defaul route state. If default route is missing, linkmgrd will stop sending ICMP probing request and fake an unhealthy status. This functionality can be disabled as well, the details is included in [default_route](./default_route.md). + + +## Network Managerment +.. ... \ No newline at end of file diff --git a/doc/dualtor/image/cluster_topology.png b/doc/dualtor/image/cluster_topology.png new file mode 100644 index 0000000000000000000000000000000000000000..a5aabad161267d991f6e4db25c1b9186dbf8200e GIT binary patch literal 25023 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 b82ZM7b1CsBPJ#blVS$6KGcFJN+qwS&Tqw?H literal 0 HcmV?d00001 diff --git a/doc/dualtor/image/icmp_format.png b/doc/dualtor/image/icmp_format.png new file mode 100644 index 0000000000000000000000000000000000000000..a82cf02af2f310c5e0c91ec23ec6035b699e9b78 GIT binary patch literal 2149 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 C9u%qo literal 0 HcmV?d00001 diff --git a/doc/dualtor/image/icmp_payload.png b/doc/dualtor/image/icmp_payload.png new file mode 100644 index 0000000000000000000000000000000000000000..bcd468ec38e6a0de5ae81549f80b6078c02a0439 GIT binary patch literal 2468 zcmZvec{tnY7RN)Q4XqlqN-b?EZKqWtCA9W+kZ5OW#8zqxM*N~;4VvCAN-eQ;h=im{ z(H6Nb9aJT$wM)`8(?JnsFhA5*LW5c+?M&z1Kkgszd){-NbDsBk&bxfR>F3;>Riu5Y` z&_E`J=@)C@&kFATCbBDIp8+Z=D9vOW^?gQ5OUvB+F#DAt0ZiTgd}Mu9w4?5aDnCI_SxZW+6@onjfH-MxmgPlYNs3UWKv7TO z2xnkl%;YxE@qi(6?MidM;uj;>@innt=YR7hiC8C&@W1&2Cjtn@kR}1L!rU8_xkk%i zdn8gE@~J0IeA6zT6n)@0M+oz>XNnr~?hXmfHSp7BKGp2BkeK6_mcfeB&3tJ>8F`h< zn_`_=>NM+^+1_CTf}A*xUHp^TZh*YOes#?xY?G>jaO3agsgcRKCdsn{mISJLex>h8 zF4!>cxVZHw=iG}aZ*S-RSHic2H@3JF7F1MwvXxufQef{<%z-1YFxaaAKL2=WcHuHX$!hcky~eX%F48Q{O0mP1;i#x5ox_q zGaBf_`>E4d+RbOvA$_O*NP3G*ZPwd&B`4&?5Y1z zGo@iYI{)FnaFMumx@TSnFAL2f%6JW<_#J7qeXrlmQ*e??YlyuZ#WkrPzh^X0a_vVS zZN)!6X5wJOG=7x#pI@5mHYjk?&U3Tf)qcJysjG$Ij$EcsI+~k>IC#&UuzIU*`RQyQ z;9phDc;8=}ZHb8hJU3t%g&Nio;>lCUMJOe3F5h%JAv+;EUPuq3>1*kXMsyXP0AN8n zBL1;RZ{UIkVT&i@iQ0}yc=iuZ zTkd7(N2{Y)dLPK$0)OP^YtHK=q(*Hk(jq-y^nj%(+@DD^YRLSy~-mr%qsn#742n@O40s$g!Q?yzQ-tjnabuC~S=kCOa zFhP2-*OKlUW8uhq*hxg_EejLtfW^av6Ly6Dy1eff{1djt+0o~eNpx67>4&zNc}2%2 zy{k#Pv-^4IJj|Tg`$VI}EcLRx7L^WYe_(7Ed4U*N`t$7?Ue zZDd*QQbg&pLtpM+{i@;0D~{Xe8Ias!*`P7~=u|&la)yzB($MNgsc``kiQRqv+2*C^ z8r=HBncnl&WcomY8{aW@sTm-QEva@rjD5X*-zE>un-T|`bdEFyX9vASMG~%~4KvlE z`*w}cVuhw}DRa;Fp{UA9t;F_|0l*A4K*XuVwR`RoYxyyyW2ft>Z5%W!eSYODNj?$m~U|FM+YHhrdxVF&gNt;13OdrPu}&BWrX2f|X#zQ2sOshz2f6W&MtW_87!-Uzk=^3JxGY9S0(Aq_I zP}=>Lc%a>l>1-aOKnJjHkBU~%r}b5l20wjFxL{TQM*<~|I&=3heC3wSH}EEp;*6Ez zC9R_UX>;vw5f$;m{-Uy8n<@}!G-elcs+56ZI z;p3m*b_jFQVbQ-w|DowB>NK3`6Fjkb=`E*hq24Rl0e0~Y4H?a+_cjTI-`KUUJXNXR z=Pcz4mUmjgY;XSBb+J}$XDBPN!{DQ8d`XzadH6~$6?z&odcDvHS!UTkdU7ItC`yUf z{^V9eTJ7_pBW4~w5t@=u01v?2_$!G=l!Nc`3!mo}HoBA7%w%<2xs-SdIi_O>RZ%3l zPc(nvt`N~YBI;CC0oYnPWj&C}(6ZBOzBiihho4J1+t6taR)o(~d_TZ2Xxo#?l{LTu z?sa$kLc?@J)Cu)RROSowW~pYg%!TAG2WXtlSsurFF94#bW&(pyM-bqP{3=4_FZ@z>gna zH`-G=EOZa6+A9CTz<*GP!2^3FAXA{wH2*>C-;6vX{S~c$Gc^wS6|MiD!AGg;`wt5g zr#ps*E{G=uI&r%MSo5Th)k$kh$3E)}zc=Ui}m2+sCK? literal 0 HcmV?d00001 From 3cdbebbfd98503f4e82cc38e80440c3e2c3292be Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Mon, 23 May 2022 10:20:35 -0700 Subject: [PATCH 19/60] update --- doc/dualtor/active_active_hld.md | 60 ++++++++++++++++++----- doc/dualtor/image/active_active.png | Bin 0 -> 48288 bytes doc/dualtor/image/active_active_peer.png | Bin 0 -> 28204 bytes doc/dualtor/image/active_active_self.png | Bin 0 -> 18423 bytes 4 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 doc/dualtor/image/active_active.png create mode 100644 doc/dualtor/image/active_active_peer.png create mode 100644 doc/dualtor/image/active_active_self.png diff --git a/doc/dualtor/active_active_hld.md b/doc/dualtor/active_active_hld.md index a55959a8cd..c1c77c40d9 100644 --- a/doc/dualtor/active_active_hld.md +++ b/doc/dualtor/active_active_hld.md @@ -37,8 +37,7 @@ T1s will have 8 uplinks to T2s. Therefore, total T1s uplink will be 64. Total up ## SONiC ToR Controlled Solution -### IP Routing -Normal Scenario +### Normal Scenario Both T0s are up and functioning and both the server NIC connections are up and functioning. * Control Plane UT0 and LT0 will advertise same VLAN (IPv4 and IPv6) to upstream T1s. Each T1 will see there are 2 available next hops for the VLAN. T1s advertise to T2 as normal. @@ -54,7 +53,7 @@ Both T0s are up and functioning and both the server NIC connections are up and f * NIC determines which link to use and sends all the packet on a flow using the same link. * T0 sends the traffic to destination server if T0 has learn the MAC address of the destination server. -Server Uplink Issue +### Server Uplink Issue Both T0s are up and functioning and some servers NIC are only connected to 1 ToR (due to cable issue, or the cable is taken out for maintenance). * Control Plane No change from the normal case. @@ -74,7 +73,7 @@ No change from the normal case. * If T0 does not have the downlink to the server, T0 will send the traffic to the peer T0 over VxLAN encap via T1s. * T0 sends the traffic to the server. -ToR Failure +### ToR Failure Only 1 T0s is up and functioning and both the server NIC connections are up and functioning. * Control Plane Only 1 T0 will advertise the VLAN (IPv4 and v6) to upstream T1s. @@ -94,7 +93,7 @@ Highlight on the difference with Active-Standby: 1. In active-standby dual ToR design, traffic from server is duplicate to both T0s, standby ToR needs to drop the packets. In active-active, NIC will determine which link to use if both are available. 1. In active-ative design, servers have up to 2 links for traffic, T1s and above devices will see more throughput from server. -### Linkmgrd +## Linkmgrd Linkmgrd will provide the determination of a ToR / link's readiness for use. ### Requirement @@ -108,22 +107,57 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. * Link Prober Linkmgrd will keep the link prober design from active-standby mode for monitoring link health status. Link prober will send ICMP packets and listen to ICMP response packets. ICMP packets will contain payload information about the ToR. ICMP replies will be duplicated to both ToRs from the server, hence a ToR can monitor the health status of its peer ToR as well. - ICMP Probing Format + Link Prober will report 4 possible states: + * LinkProberUnknown: Serves as initial states. This state is also reachable in the case of no ICMP reply is received. + * LinkProberActive: It indicates that LinkMgr receives ICMP replies containing ID of the current ToR. + * LinkProberPeerUnknown: It indicates that LinkMgr did not receive ICMP replies containing ID of the peer ToR. Hence, there is a chance that peer ToR’s link is currently down. + * LinkProberPeerAcitve: It indicates that LinkMgr receives ICMP replies containing ID of the peer ToR, or in other words, peer ToR’s links appear to be active. + + __ICMP Probing Format__ The source MAC will be ToR's SVI mac address. Ethernet destination will be the well-known MAC address. Source IP will be ToR's Loopback IP, destination IP will be SoC's IP address, which will be introduced as a field in minigraph. - ![image info](./image/icmp_format.png) - Linkmgrd also adapt TLV (Type-Length-Value) as the encoding schema in payload for additional information elements, including cookie, version, ToR GUID etc. - ![image info](./image/icmp_payload.png) + ![icmp_format](./image/icmp_format.png) - ... ... + Linkmgrd also adapt TLV (Type-Length-Value) as the encoding schema in payload for additional information elements, including cookie, version, ToR GUID etc. + ![icmp_payload](./image/icmp_payload.png) * Link State - When link is down, linkmgrd will receive notification based on kernel message from netlink. This notification will be used to determine if ToR is healthy. + When link is down, linkmgrd will receive notification from SWSS based on kernel message from netlink. This notification will be used to determine if ToR is healthy. + +* Admin Forwarding State + ToRs will signal NIC if the link is active / standby, we will call this active / standby state as admin forwarding state. It's up to NIC to determine which link to use if both are active, but it should never choose to use a standby link. This logic provides ToR more control over traffic forwarding. * Cable Control through gRPC In active-active design, we will use gRPC to do cable control and signal NIC if ToRs is up active. SoC will run a gRPC server. Linkmgrd will determine server side forwarding sate based on link prober status and link state. Then linkmgrd can invoke transceiver daemon to update NIC if ToRs are active through gRPC calls. - + + Current defined gRPC services between SoC and ToRs related with linkmgrd cable controlling: + * DualToRActive + 1. Query forwarding state of ports for both peer and self ToR; + 1. Query server side link state of ports for both peer and self ToR; + 1. Set forwarding states of ports for both peer and self ToR; + * GracefulRestart + 1. Shutdown / restart notification from SoC to ToR. + +* Acitve-Active State Machine + Active-acitve state transition logics are simplified compared to active-standby. In active-standby, linkmgrd makes mux toggle decisions based on y-cable direction, while for active-active, two links are more independent. Linkmgrd will only make state transition decisions based on healthy indicators. + + To be more specific, if link prober indicates active AND link state appears to be up, linkmgrd should determine link's forwarding state as active, otherwise, it should be standby. + + ![active_active_self](./image/active_active_self.png) + + Linkmgrd also provides rescue mechanism when peer can't switch to standby for some , i.e. link failures. If link prober doesn't receive peer's heartbeat response AND self ToR is in healthy active state, linkmgrd should determine peer link to be standby. + ![active_active_peer](./image/active_active_peer.png) + +### Incremental Featrues * Default gateway to T1 - If default gateway to T1 is missing, dual ToR system can suffer from northbound packet loss, hence linkmgrd also monitors defaul route state. If default route is missing, linkmgrd will stop sending ICMP probing request and fake an unhealthy status. This functionality can be disabled as well, the details is included in [default_route](./default_route.md). + If default gateway to T1 is missing, dual ToR system can suffer from northbound packet loss, hence linkmgrd also monitors defaul route state. If default route is missing, linkmgrd will stop sending ICMP probing request and fake an unhealthy status. This functionality can be disabled as well, the details is included in [default_route](https://github.com/Azure/sonic-linkmgrd/blob/master/doc/default_route.md). + +* Link Prober Packet Loss Statics + +* Supoort for Detachment + + + +### Command Line ## Network Managerment diff --git a/doc/dualtor/image/active_active.png b/doc/dualtor/image/active_active.png new file mode 100644 index 0000000000000000000000000000000000000000..f05c136a45b167d3201dadaa56c0413946f0ca09 GIT binary patch literal 48288 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 literal 0 HcmV?d00001 diff --git a/doc/dualtor/image/active_active_self.png b/doc/dualtor/image/active_active_self.png new file mode 100644 index 0000000000000000000000000000000000000000..0266c40675b8b45cdd7a54e6b334f5dfa95ce5a5 GIT binary patch literal 18423 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 z Date: Mon, 23 May 2022 11:33:01 -0700 Subject: [PATCH 20/60] update server requirements --- doc/dualtor/active_active_hld.md | 38 +++++++++++++++++------------ doc/dualtor/image/gRPC_failure.png | Bin 0 -> 38618 bytes 2 files changed, 22 insertions(+), 16 deletions(-) create mode 100644 doc/dualtor/image/gRPC_failure.png diff --git a/doc/dualtor/active_active_hld.md b/doc/dualtor/active_active_hld.md index c1c77c40d9..257aa36e15 100644 --- a/doc/dualtor/active_active_hld.md +++ b/doc/dualtor/active_active_hld.md @@ -6,18 +6,22 @@ Active-active dual ToR link manager is an evolution of active-standby dual ToR l | Rev | Date | Author | Change Description | |:---:|:--------:|:---------------:|--------------------| -| 0.1 | 05/23/22 | | Initial version | +| 0.1 | 05/23/22 | Jing Zhang | Initial version | ## Scope -This document provides the high level design of SONiC dual toR solution supporting active-active setup. +This document provides the high level design of SONiC dual toR solution, supporting active-active setup. -## Server Network Interface Card (NIC) Infomation -Server NIC will be deployed on Gen 9 Cluster Design. Each server will have a NIC will have 2 x 100Gbps uplinks. These uplinks will be connected to 2 different ToRs with Direct Attach Copper (DAC) Cable. +## Complexity on Server side +In general, the intoduction of active-active will simplify state transition logics for SONiC dual ToRs. The complexity is transferred to server side. Each server will have a Network Interface Card (NIC) connected to 2 x 100Gbps uplinks. These uplinks will be connected to 2 different ToRs with Direct Attach Copper (DAC) Cable. No Y-cable is needed. -## Top of Rack (ToR) Information -To support active-active, the ToR must be running SONiC. The hardware is a 32 or 64 port x 100G device. Note with Gen 9 Cluster, the ToR and T1 port speed will be still on 100Gbps. - -Two DAC cables will be used to connect the Server NIC and 2 ToRs. No Y-cable is needed. +For active-active setup, the requirements for server side are: +1. Server NIC is responsible to deliver traffic up the stack once receiving sourthbound (tier 0 device to server) traffic. +1. Server NIC is responsible to dispense northbound (server to tier 0) traffic between two active links. +1. Server should provide support for ToR to control traffic forwarding if needed, and follow this control when dispensing traffic. +1. Server should replicate there northbound traffic to both ToRs: + * Specified ICMP replies (for probing link health status) + * ARP + * Neighbor advertisements ## Cluster Topology @@ -127,7 +131,7 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. ToRs will signal NIC if the link is active / standby, we will call this active / standby state as admin forwarding state. It's up to NIC to determine which link to use if both are active, but it should never choose to use a standby link. This logic provides ToR more control over traffic forwarding. * Cable Control through gRPC - In active-active design, we will use gRPC to do cable control and signal NIC if ToRs is up active. SoC will run a gRPC server. Linkmgrd will determine server side forwarding sate based on link prober status and link state. Then linkmgrd can invoke transceiver daemon to update NIC if ToRs are active through gRPC calls. + In active-active design, we will use gRPC to do cable control and signal NIC if ToRs is up active. SoC will run a gRPC server. Linkmgrd will determine server side forwarding state based on link prober status and link state. Then linkmgrd can invoke transceiver daemon to update NIC if ToRs are active through gRPC calls. Current defined gRPC services between SoC and ToRs related with linkmgrd cable controlling: * DualToRActive @@ -145,20 +149,22 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. ![active_active_self](./image/active_active_self.png) Linkmgrd also provides rescue mechanism when peer can't switch to standby for some , i.e. link failures. If link prober doesn't receive peer's heartbeat response AND self ToR is in healthy active state, linkmgrd should determine peer link to be standby. - ![active_active_peer](./image/active_active_peer.png) + ![active_active_peer](./image/active_active_peer.png) + + When control channel is unreachable, ToR won't block the traffic forwarding, but it will periodically check gRPC server's healthiness. It will make sure server side's admin forwarding state aligns with linkmgrd's decision. + ![grpc_failure](./image/gRPC_failure.png) + ### Incremental Featrues * Default gateway to T1 If default gateway to T1 is missing, dual ToR system can suffer from northbound packet loss, hence linkmgrd also monitors defaul route state. If default route is missing, linkmgrd will stop sending ICMP probing request and fake an unhealthy status. This functionality can be disabled as well, the details is included in [default_route](https://github.com/Azure/sonic-linkmgrd/blob/master/doc/default_route.md). * Link Prober Packet Loss Statics - + Link prober will by default send heartbeat packet every 100 ms, the packet loss statics can be a good system healthiness measurement. An incremental feature is to collect the packet loss counts, start time and end time. The collected data is stored and updated in state db. User can check and reset through CLI. + * Supoort for Detachment - - + User can config linkmgrd to a certain mode, so it won't switch to active / standby based on health indicators. User can also config linkmgrd to a mode, so it won't modify peer's forwarding state. This support will be useful for maintenance, upgrade and testing scenarios. ### Command Line +TBD - -## Network Managerment -.. ... \ No newline at end of file diff --git a/doc/dualtor/image/gRPC_failure.png b/doc/dualtor/image/gRPC_failure.png new file mode 100644 index 0000000000000000000000000000000000000000..6da949cd60e64cb27aa7cd2ae90016cdd2c76fdc GIT binary patch literal 38618 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 EA1 Date: Mon, 23 May 2022 12:04:19 -0700 Subject: [PATCH 21/60] update per offline discussion --- doc/dualtor/active_active_hld.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/dualtor/active_active_hld.md b/doc/dualtor/active_active_hld.md index 257aa36e15..76041d6c52 100644 --- a/doc/dualtor/active_active_hld.md +++ b/doc/dualtor/active_active_hld.md @@ -11,14 +11,14 @@ Active-active dual ToR link manager is an evolution of active-standby dual ToR l ## Scope This document provides the high level design of SONiC dual toR solution, supporting active-active setup. -## Complexity on Server side -In general, the intoduction of active-active will simplify state transition logics for SONiC dual ToRs. The complexity is transferred to server side. Each server will have a Network Interface Card (NIC) connected to 2 x 100Gbps uplinks. These uplinks will be connected to 2 different ToRs with Direct Attach Copper (DAC) Cable. No Y-cable is needed. +## Server requirements +In general, the intoduction of active-active will simplify state transition logics for SONiC dual ToRs. The complexity is transferred from smart y-cable to server side. Each server will have a Network Interface Card (NIC) connected to 2 x 100Gbps uplinks. These uplinks will be connected to 2 different ToRs with Direct Attach Copper (DAC) Cable. No Y-cable is needed. For active-active setup, the requirements for server side are: 1. Server NIC is responsible to deliver traffic up the stack once receiving sourthbound (tier 0 device to server) traffic. -1. Server NIC is responsible to dispense northbound (server to tier 0) traffic between two active links. -1. Server should provide support for ToR to control traffic forwarding if needed, and follow this control when dispensing traffic. -1. Server should replicate there northbound traffic to both ToRs: +1. Server NIC is responsible to dispense northbound (server to tier 0) traffic between two active links: at IO stream (5 tuples) level. each stream will be dispatched to one of the 2 up links until link state changes. +1. Server should provide support for ToR to control traffic forwarding, and follow this control when dispensing traffic. +1. Server should replicate the northbound traffic to both ToRs: * Specified ICMP replies (for probing link health status) * ARP * Neighbor advertisements From 4e8df73ca067379ec346722b78e2be9949387ac0 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Mon, 23 May 2022 12:16:45 -0700 Subject: [PATCH 22/60] update unclear statement --- doc/dualtor/active_active_hld.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/doc/dualtor/active_active_hld.md b/doc/dualtor/active_active_hld.md index 76041d6c52..e775519d35 100644 --- a/doc/dualtor/active_active_hld.md +++ b/doc/dualtor/active_active_hld.md @@ -12,11 +12,12 @@ Active-active dual ToR link manager is an evolution of active-standby dual ToR l This document provides the high level design of SONiC dual toR solution, supporting active-active setup. ## Server requirements -In general, the intoduction of active-active will simplify state transition logics for SONiC dual ToRs. The complexity is transferred from smart y-cable to server side. Each server will have a Network Interface Card (NIC) connected to 2 x 100Gbps uplinks. These uplinks will be connected to 2 different ToRs with Direct Attach Copper (DAC) Cable. No Y-cable is needed. +For active-active setup, some complexity is transferred from smart y-cable to server side. Each server will have a Network Interface Card (NIC) connected to 2 x 100Gbps uplinks. These uplinks will be connected to 2 different ToRs with Direct Attach Copper (DAC) Cable. No Y-cable is needed any more. For active-active setup, the requirements for server side are: 1. Server NIC is responsible to deliver traffic up the stack once receiving sourthbound (tier 0 device to server) traffic. -1. Server NIC is responsible to dispense northbound (server to tier 0) traffic between two active links: at IO stream (5 tuples) level. each stream will be dispatched to one of the 2 up links until link state changes. +1. Server NIC is responsible to dispense northbound (server to tier 0) traffic between two active links: at IO stream (5 tuples) level. Each stream will be dispatched to one of the 2 uplinks until link state changes. +1. Each ToR has a well-known IP. For northbound traffic, server should dispatch IO towards these IPs to the corresponding uplinks. 1. Server should provide support for ToR to control traffic forwarding, and follow this control when dispensing traffic. 1. Server should replicate the northbound traffic to both ToRs: * Specified ICMP replies (for probing link health status) @@ -44,18 +45,19 @@ T1s will have 8 uplinks to T2s. Therefore, total T1s uplink will be 64. Total up ### Normal Scenario Both T0s are up and functioning and both the server NIC connections are up and functioning. * Control Plane - UT0 and LT0 will advertise same VLAN (IPv4 and IPv6) to upstream T1s. Each T1 will see there are 2 available next hops for the VLAN. T1s advertise to T2 as normal. + UT0 and LT0 will advertise same VLAN (IPv4 and IPv6) to upstream T1s. Each T1 will see there are 2 available next hops for the VLAN. T1s advertise to T2 as normal. + * Data Plane * Traffic to the server * Traffic lands on any of the T1 by ECMP from T2s. * T1 forwards traffic to either of the T0s by ECMP. - * T0 sends the traffic to the server. + * T0 sends the traffic to the server and NIC delivers traffic up the stack. * Traffic from the server to outside the cluster * NIC determines which link to use and sends all the packets on a flow using the same link. * T0 sends the traffic to the T1 by ECMP. * Traffic from the server to within the cluster * NIC determines which link to use and sends all the packet on a flow using the same link. - * T0 sends the traffic to destination server if T0 has learn the MAC address of the destination server. + * T0 sends the traffic to destination server if T0 has learnt the MAC address of the destination server. ### Server Uplink Issue Both T0s are up and functioning and some servers NIC are only connected to 1 ToR (due to cable issue, or the cable is taken out for maintenance). @@ -65,8 +67,8 @@ No change from the normal case. * Traffic to the server * Traffic lands on any of the T1 by ECMP from T2s. * T1 forwards traffic to either of the T0s by ECMP. - * If T0 does not have the downlink to the server, T0 will send the traffic to the peer T0 over VxLAN encap via T1s. - * T0 sends the traffic to the server. + * **If T0 does not have the downlink to the server, T0 will send the traffic to the peer T0 over VxLAN encap via T1s.** + * T0 sends the traffic to the server and NIC delivers traffic up the stack. * Traffic from the server to outside the cluster * T0 will signal to NIC which side to use. * NIC determines which link to use and sends all the packets on a flow using the same link. If server NIC has only 1 connection up, all traffic will be on this connection. @@ -78,7 +80,7 @@ No change from the normal case. * T0 sends the traffic to the server. ### ToR Failure -Only 1 T0s is up and functioning and both the server NIC connections are up and functioning. +Only 1 T0s is up and functioning. * Control Plane Only 1 T0 will advertise the VLAN (IPv4 and v6) to upstream T1s. * Data Plane From f6dbda7b152a898af06fcb34887ad76ffe257f74 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Mon, 23 May 2022 17:29:05 -0700 Subject: [PATCH 23/60] add decision table --- doc/dualtor/active_active_hld.md | 35 +++++++++++++++------------ doc/dualtor/image/decision_table.png | Bin 0 -> 19908 bytes 2 files changed, 19 insertions(+), 16 deletions(-) create mode 100644 doc/dualtor/image/decision_table.png diff --git a/doc/dualtor/active_active_hld.md b/doc/dualtor/active_active_hld.md index e775519d35..856ea91d9a 100644 --- a/doc/dualtor/active_active_hld.md +++ b/doc/dualtor/active_active_hld.md @@ -15,13 +15,14 @@ This document provides the high level design of SONiC dual toR solution, support For active-active setup, some complexity is transferred from smart y-cable to server side. Each server will have a Network Interface Card (NIC) connected to 2 x 100Gbps uplinks. These uplinks will be connected to 2 different ToRs with Direct Attach Copper (DAC) Cable. No Y-cable is needed any more. For active-active setup, the requirements for server side are: -1. Server NIC is responsible to deliver traffic up the stack once receiving sourthbound (tier 0 device to server) traffic. +1. Server NIC is responsible to deliver southbound (tier 0 device to server) traffic from either uplinks to applications running on server host. 1. Server NIC is responsible to dispense northbound (server to tier 0) traffic between two active links: at IO stream (5 tuples) level. Each stream will be dispatched to one of the 2 uplinks until link state changes. -1. Each ToR has a well-known IP. For northbound traffic, server should dispatch IO towards these IPs to the corresponding uplinks. 1. Server should provide support for ToR to control traffic forwarding, and follow this control when dispensing traffic. + * gRPC is introduced for this requirement. + * Each ToR will have a well-known IP. Server NIC should dispatch gRPC replies towards these IPs to the corresponding uplinks. 1. Server should replicate the northbound traffic to both ToRs: * Specified ICMP replies (for probing link health status) - * ARP + * ARP propagation * Neighbor advertisements @@ -130,18 +131,7 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. When link is down, linkmgrd will receive notification from SWSS based on kernel message from netlink. This notification will be used to determine if ToR is healthy. * Admin Forwarding State - ToRs will signal NIC if the link is active / standby, we will call this active / standby state as admin forwarding state. It's up to NIC to determine which link to use if both are active, but it should never choose to use a standby link. This logic provides ToR more control over traffic forwarding. - -* Cable Control through gRPC - In active-active design, we will use gRPC to do cable control and signal NIC if ToRs is up active. SoC will run a gRPC server. Linkmgrd will determine server side forwarding state based on link prober status and link state. Then linkmgrd can invoke transceiver daemon to update NIC if ToRs are active through gRPC calls. - - Current defined gRPC services between SoC and ToRs related with linkmgrd cable controlling: - * DualToRActive - 1. Query forwarding state of ports for both peer and self ToR; - 1. Query server side link state of ports for both peer and self ToR; - 1. Set forwarding states of ports for both peer and self ToR; - * GracefulRestart - 1. Shutdown / restart notification from SoC to ToR. + ToRs will signal NIC if the link is active / standby, we will call this active / standby state as admin forwarding state. It's up to NIC to determine which link to use if both are active, but it should never choose to use a standby link. This logic provides ToR more control over traffic forwarding. * Acitve-Active State Machine Active-acitve state transition logics are simplified compared to active-standby. In active-standby, linkmgrd makes mux toggle decisions based on y-cable direction, while for active-active, two links are more independent. Linkmgrd will only make state transition decisions based on healthy indicators. @@ -150,12 +140,25 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. ![active_active_self](./image/active_active_self.png) - Linkmgrd also provides rescue mechanism when peer can't switch to standby for some , i.e. link failures. If link prober doesn't receive peer's heartbeat response AND self ToR is in healthy active state, linkmgrd should determine peer link to be standby. + Linkmgrd also provides rescue mechanism when peer can't switch to standby for some reason, i.e. link failures. If link prober doesn't receive peer's heartbeat response AND self ToR is in healthy active state, linkmgrd should determine peer link to be standby. ![active_active_peer](./image/active_active_peer.png) When control channel is unreachable, ToR won't block the traffic forwarding, but it will periodically check gRPC server's healthiness. It will make sure server side's admin forwarding state aligns with linkmgrd's decision. ![grpc_failure](./image/gRPC_failure.png) +* Cable Control through gRPC + In active-active design, we will use gRPC to do cable control and signal NIC if ToRs is up active. SoC will run a gRPC server. Linkmgrd will determine server side forwarding state based on link prober status and link state. Then linkmgrd can invoke transceiver daemon to update NIC if ToRs are active through gRPC calls. + + Current defined gRPC services between SoC and ToRs related with linkmgrd cable controlling: + * DualToRActive + 1. Query forwarding state of ports for both peer and self ToR; + 1. Query server side link state of ports for both peer and self ToR; + 1. Set forwarding states of ports for both peer and self ToR; + * GracefulRestart + 1. Shutdown / restart notification from SoC to ToR. + + To summarize the state transition decision we talk about, and the corresponding gRPC action to take, we have this decision table below: + ![icmp_payload](./image/decision_table.png) ### Incremental Featrues * Default gateway to T1 diff --git a/doc/dualtor/image/decision_table.png b/doc/dualtor/image/decision_table.png new file mode 100644 index 0000000000000000000000000000000000000000..1c9c82e7646ed2ba290025a2685f72a89b940ea8 GIT binary patch literal 19908 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 YwvdIm{yeB>3qa~!H@=3ra_7 Date: Mon, 23 May 2022 18:23:33 -0700 Subject: [PATCH 24/60] mention ToRs having same IP & MAC to server view --- doc/dualtor/active_active_hld.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/dualtor/active_active_hld.md b/doc/dualtor/active_active_hld.md index 856ea91d9a..97dd1a7153 100644 --- a/doc/dualtor/active_active_hld.md +++ b/doc/dualtor/active_active_hld.md @@ -16,6 +16,7 @@ For active-active setup, some complexity is transferred from smart y-cable to se For active-active setup, the requirements for server side are: 1. Server NIC is responsible to deliver southbound (tier 0 device to server) traffic from either uplinks to applications running on server host. + * ToRs are presenting same IP, same MAC to server on both links. 1. Server NIC is responsible to dispense northbound (server to tier 0) traffic between two active links: at IO stream (5 tuples) level. Each stream will be dispatched to one of the 2 uplinks until link state changes. 1. Server should provide support for ToR to control traffic forwarding, and follow this control when dispensing traffic. * gRPC is introduced for this requirement. From 4a5edee828cdf01821f2de3685c269daf814afda Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Wed, 25 May 2022 18:41:54 +0300 Subject: [PATCH 25/60] [dump] Add ACL modules (#983) Signed-off-by: Stepan Blyschak --- doc/Dump-Utility.md | 266 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 234 insertions(+), 32 deletions(-) diff --git a/doc/Dump-Utility.md b/doc/Dump-Utility.md index 940017af13..5ed9398dc3 100644 --- a/doc/Dump-Utility.md +++ b/doc/Dump-Utility.md @@ -18,10 +18,13 @@ * [2.3 Helper Methods Available](#23-helper-methods-available) * [2.4 Match Infrastructure](#24-Match-Infrastructure) * [2.5 MatchRequest Examples](#25-matchrequest-examples) - * [3. Unit Tests](#3-unit-tests) - * [4. TechSupport](#4-techsupport) + * [3. Modules](#3-modules) + * [3.1 ACL Table](#31-acl-table) + * [3.2 ACL Rule](#32-acl-rule) + * [4. Unit Tests](#4-unit-tests) + * [5. TechSupport](#5-techsupport) -### Revision +### Revision | Rev | Date | Author | Change Description | |:---:|:-----------:|:-------------------------|:----------------------| @@ -571,7 +574,7 @@ To add a new module, these guidelines have to be followed. } } Note: DB_NAME could be either of ["CONFIG_DB", "APPL_DB", "ASIC_DB", "STATE_DB", ....] or "CONFIG_FILE". -COPP is a example which will have a entry "CONFIG_FILE". This entry is required for COPP because, the default COPP entries are read from copp_cfg.json by coppmgr and are not present in the CONFIG_DB. +COPP is a example which will have a entry "CONFIG_FILE". This entry is required for COPP because, the default COPP entries are read from copp_cfg.json by coppmgr and are not present in the CONFIG_DB. Any extra entries which are added by the user are present in the CONFIG_DB. Hence it is required to have an extra "CONFIG_FILE" option. ``` @@ -639,7 +642,7 @@ class Port(Executor): ``` 1) display_template(dbs=['CONFIG_DB', 'APPL_DB', 'ASIC_DB', 'STATE_DB']): Returns a dictionary of format JSON Template 1 2) MatchEngine / MatchRequest: Provided to abstract the heavy lifting in fetching the required data from redis-db/config-files. More info in the next section. -3) verbose_print(str_): prints to the stdout based on verbosity provided by the user. +3) verbose_print(str_): prints to the stdout based on verbosity provided by the user. 4) handle_error(err_str, excep=False): Prints the error output to stdout, if any experienced by the module, Set excep = True, to raise an exception 5) handle_multiple_keys_matched_error(err_str, key_to_go_with="", excep=False): When a filtering criteria specified by the module matches multiple keys, wherein it is expected to match ony one, this method can be used. ``` @@ -657,7 +660,7 @@ To Abstract this functionality out, a MatchEngine class is created. A MatchReque { "Table": "", # Mandatory, A Valid Table Name "key_pattern": "", # Optional, Defaults to "*". Eg: "*" will match all the keys. - # tablekey_pattern is directly applied for filtering entries + # tablekey_pattern is directly applied for filtering entries "field": "", # Optional, Defaults to None "value": "", # Optional, Value to match, Defaults to None "return_fields": [ @@ -668,8 +671,8 @@ To Abstract this functionality out, a MatchEngine class is created. A MatchReque # Only one of the db/file fields should have a non-empty string. "just_keys": "true|false" # Mandatory, if true, Only Returns the keys matched. Does not return field-value pairs. Defaults to True "ns" : DEFAULT_NAMESPACE # namespace argument, if nothing is provided, default namespace is used - "match_entire_list" : False # Some of the fields in redis can consist of multiple values eg: trap_ids = "bgp,bgpv6,ospf". - When this arg is set to true, entire list is matched incluing the ",". + "match_entire_list" : False # Some of the fields in redis can consist of multiple values eg: trap_ids = "bgp,bgpv6,ospf". + When this arg is set to true, entire list is matched incluing the ",". When False, the values are split based on "," and individual items are matched with } ``` @@ -684,7 +687,7 @@ To Abstract this functionality out, a MatchEngine class is created. A MatchReque ###### JSON Template 3: Return Dictionary by the MatchEngine: ``` -{ +{ "error": "", # Error String, if any. Empty Otherwise "keys": [], # Match found for the request "return_values": {} # Return Values for the corresponding return_fields passed @@ -705,13 +708,13 @@ Possible Error strings returned by the MatchEngine. 9) "Field is provided, but no value is provided to compare with" 10) "When Just_keys is set to False, return_fields should be empty" 11) "Return Fields should be of list type" - + Other Errors: 12) "No Entries found for Table|key_pattern provided. 13) "Connection Error" 14) "No Keys found after applying the filtering criteria" - Note: Run the "dump state arg" command with -v option to print these errors any other exceptions thrown to the stdout. + Note: Run the "dump state arg" command with -v option to print these errors any other exceptions thrown to the stdout. ``` @@ -728,10 +731,10 @@ req.just_keys = True req.return_fields = [] Return Dict: -{ - "error": "", - "keys": ["ASIC_STATE:SAI_OBJECT_TYPE_QUEUE:oid:0x1500000000052f"], - "return_values": {} +{ + "error": "", + "keys": ["ASIC_STATE:SAI_OBJECT_TYPE_QUEUE:oid:0x1500000000052f"], + "return_values": {} } 2) Fetch the entry for ASIC_STATE:SAI_OBJECT_TYPE_QUEUE:oid:0x150000000002cf from ASIC_DB (Keys + Field-Value Pairs) @@ -744,13 +747,13 @@ req.just_keys = False req.return_fields = [] Return Dict: -{ - "error": "", +{ + "error": "", "keys": [{"ASIC_STATE:SAI_OBJECT_TYPE_QUEUE:oid:0x1500000000052f": { "NULL": "NULL", "SAI_QUEUE_ATTR_TYPE": "SAI_QUEUE_TYPE_UNICAST", - "SAI_QUEUE_ATTR_INDEX": "4"}], - "return_values": {} + "SAI_QUEUE_ATTR_INDEX": "4"}], + "return_values": {} } @@ -765,10 +768,10 @@ req.db = "ASIC_DB" req.return_fields = ["SAI_HOSTIF_TRAP_ATTR_TRAP_GROUP"] Return Dict: -{ - "error": "", - "keys": ["ASIC_STATE:SAI_OBJECT_TYPE_HOSTIF_TRAP:oid:0x22000000000592"], - "return_values": {"ASIC_STATE:SAI_OBJECT_TYPE_HOSTIF_TRAP:oid:0x22000000000592" : {"SAI_HOSTIF_TRAP_ATTR_TRAP_GROUP" : "oid:0x11000000000591"}} +{ + "error": "", + "keys": ["ASIC_STATE:SAI_OBJECT_TYPE_HOSTIF_TRAP:oid:0x22000000000592"], + "return_values": {"ASIC_STATE:SAI_OBJECT_TYPE_HOSTIF_TRAP:oid:0x22000000000592" : {"SAI_HOSTIF_TRAP_ATTR_TRAP_GROUP" : "oid:0x11000000000591"}} } 4) Fetch the entry for COPP_TRAP table which has trap_id sample_packet from the copp_cfg.json file @@ -782,14 +785,213 @@ req.file = "/etc/sonic/copp_cfg.json" req.return_fields = ["trap_group"] Return Dict: -{ - "error": "", - "keys": ["COPP_TRAP|sflow"], - "return_values": {"COPP_TRAP|sflow" : {"trap_group" : "queue2_group1"}} +{ + "error": "", + "keys": ["COPP_TRAP|sflow"], + "return_values": {"COPP_TRAP|sflow" : {"trap_group" : "queue2_group1"}} } ``` -## 3 **Unit Tests**: +## 3 **Modules**: + +### 3.1 ACL Table + +ACL Tables configuration resides in CONFIG DB in table *ACL_TABLE*. Tables in *ACL_TABLE* may reference another table *ACL_TABLE_TYPE* that holds the table type configuration or may use one of default table types (L3, L3V6, MIRROR, etc.). This information is dumped from CONFIG DB. Orchagent processes *ACL_TABLE* and *ACL_TABLE_TYPE* configuration and manages the following ASIC resources: + - *SAI_OBJECT_TYPE_ACL_TABLE* + - *SAI_OBJECT_TYPE_ACL_TABLE_GROUP* + - *SAI_OBJECT_TYPE_ACL_TABLE_GROUP_MEMBER*. + + There is no direct mapping of CONFIG DB ACL tables to ASIC DB objects. However, for dump utility purposes, we can correlate *ACL_TABLE* and *SAI_OBJECT_TYPE_ACL_TABLE* if there is at least one ACL rule in the table. We may use the *ACL_COUNTER_RULE_MAP* in COUNTERS DB in order to find the *SAI_OBJECT_TYPE_ACL_COUNTER* and extract the table OID from it. It is done using the following schema: + +```mermaid +flowchart LR + ACL_TABLE --> B{Has at least 1 rule} + B --> |Yes| ACL_COUNTER_RULE_MAP + B --> |No| C[No entries in ASIC DB dump] + ACL_COUNTER_RULE_MAP --> COUNTER_OID + COUNTER_OID --> TABLE_OID + TABLE_OID --> TABLE_GROUP_MEMBER + TABLE_GROUP_MEMBER --> TABLE_GROUP +``` + +``` +admin@sonic:~$ dump state acl_table DATA_L3 -t ++------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| acl_table_name | DB_NAME | DUMP | ++==================+===========+===========================================================================================================================================================================================================+ +| DATA_L3 | CONFIG_DB | +-------------------+-----------------------------+ | +| | | | Keys | field-value pairs | | +| | | +===================+=============================+ | +| | | | ACL_TABLE|DATA_L3 | +-------------+-----------+ | | +| | | | | | field | value | | | +| | | | | |-------------+-----------| | | +| | | | | | policy_desc | DATA_L3 | | | +| | | | | | ports | Ethernet0 | | | +| | | | | | | Ethernet4 | | | +| | | | | | stage | ingress | | | +| | | | | | type | L3 | | | +| | | | | +-------------+-----------+ | | +| | | +-------------------+-----------------------------+ | ++------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| DATA_L3 | ASIC_DB | +-----------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------+ | +| | | | Keys | field-value pairs | | +| | | +=======================================================================+===============================================================================================================================+ | +| | | | ASIC_STATE:SAI_OBJECT_TYPE_ACL_TABLE:oid:0x7000000000600 | +---------------------------------------------+-----------------------------------------------------------------------------+ | | +| | | | | | field | value | | | +| | | | | |---------------------------------------------+-----------------------------------------------------------------------------| | | +| | | | | | SAI_ACL_TABLE_ATTR_ACL_BIND_POINT_TYPE_LIST | 2:SAI_ACL_BIND_POINT_TYPE_PORT,SAI_ACL_BIND_POINT_TYPE_LAG | | | +| | | | | | SAI_ACL_TABLE_ATTR_ACL_STAGE | SAI_ACL_STAGE_INGRESS | | | +| | | | | | SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE | true | | | +| | | | | | SAI_ACL_TABLE_ATTR_FIELD_ACL_RANGE_TYPE | 2:SAI_ACL_RANGE_TYPE_L4_SRC_PORT_RANGE,SAI_ACL_RANGE_TYPE_L4_DST_PORT_RANGE | | | +| | | | | | SAI_ACL_TABLE_ATTR_FIELD_DST_IP | true | | | +| | | | | | SAI_ACL_TABLE_ATTR_FIELD_ETHER_TYPE | true | | | +| | | | | | SAI_ACL_TABLE_ATTR_FIELD_ICMP_CODE | true | | | +| | | | | | SAI_ACL_TABLE_ATTR_FIELD_ICMP_TYPE | true | | | +| | | | | | SAI_ACL_TABLE_ATTR_FIELD_IP_PROTOCOL | true | | | +| | | | | | SAI_ACL_TABLE_ATTR_FIELD_L4_DST_PORT | true | | | +| | | | | | SAI_ACL_TABLE_ATTR_FIELD_L4_SRC_PORT | true | | | +| | | | | | SAI_ACL_TABLE_ATTR_FIELD_OUTER_VLAN_ID | true | | | +| | | | | | SAI_ACL_TABLE_ATTR_FIELD_SRC_IP | true | | | +| | | | | | SAI_ACL_TABLE_ATTR_FIELD_TCP_FLAGS | true | | | +| | | | | +---------------------------------------------+-----------------------------------------------------------------------------+ | | +| | | +-----------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------+ | +| | | | ASIC_STATE:SAI_OBJECT_TYPE_ACL_TABLE_GROUP_MEMBER:oid:0xc000000000602 | +----------------------------------------------------+---------------------+ | | +| | | | | | field | value | | | +| | | | | |----------------------------------------------------+---------------------| | | +| | | | | | SAI_ACL_TABLE_GROUP_MEMBER_ATTR_ACL_TABLE_GROUP_ID | oid:0xb0000000005f7 | | | +| | | | | | SAI_ACL_TABLE_GROUP_MEMBER_ATTR_ACL_TABLE_ID | oid:0x7000000000600 | | | +| | | | | | SAI_ACL_TABLE_GROUP_MEMBER_ATTR_PRIORITY | 100 | | | +| | | | | +----------------------------------------------------+---------------------+ | | +| | | +-----------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------+ | +| | | | ASIC_STATE:SAI_OBJECT_TYPE_ACL_TABLE_GROUP_MEMBER:oid:0xc000000000601 | +----------------------------------------------------+---------------------+ | | +| | | | | | field | value | | | +| | | | | |----------------------------------------------------+---------------------| | | +| | | | | | SAI_ACL_TABLE_GROUP_MEMBER_ATTR_ACL_TABLE_GROUP_ID | oid:0xb0000000005f5 | | | +| | | | | | SAI_ACL_TABLE_GROUP_MEMBER_ATTR_ACL_TABLE_ID | oid:0x7000000000600 | | | +| | | | | | SAI_ACL_TABLE_GROUP_MEMBER_ATTR_PRIORITY | 100 | | | +| | | | | +----------------------------------------------------+---------------------+ | | +| | | +-----------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------+ | +| | | | ASIC_STATE:SAI_OBJECT_TYPE_ACL_TABLE_GROUP:oid:0xb0000000005f7 | +---------------------------------------------------+-----------------------------------+ | | +| | | | | | field | value | | | +| | | | | |---------------------------------------------------+-----------------------------------| | | +| | | | | | SAI_ACL_TABLE_GROUP_ATTR_ACL_BIND_POINT_TYPE_LIST | 1:SAI_ACL_BIND_POINT_TYPE_PORT | | | +| | | | | | SAI_ACL_TABLE_GROUP_ATTR_ACL_STAGE | SAI_ACL_STAGE_INGRESS | | | +| | | | | | SAI_ACL_TABLE_GROUP_ATTR_TYPE | SAI_ACL_TABLE_GROUP_TYPE_PARALLEL | | | +| | | | | +---------------------------------------------------+-----------------------------------+ | | +| | | +-----------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------+ | +| | | | ASIC_STATE:SAI_OBJECT_TYPE_ACL_TABLE_GROUP:oid:0xb0000000005f5 | +---------------------------------------------------+-----------------------------------+ | | +| | | | | | field | value | | | +| | | | | |---------------------------------------------------+-----------------------------------| | | +| | | | | | SAI_ACL_TABLE_GROUP_ATTR_ACL_BIND_POINT_TYPE_LIST | 1:SAI_ACL_BIND_POINT_TYPE_PORT | | | +| | | | | | SAI_ACL_TABLE_GROUP_ATTR_ACL_STAGE | SAI_ACL_STAGE_INGRESS | | | +| | | | | | SAI_ACL_TABLE_GROUP_ATTR_TYPE | SAI_ACL_TABLE_GROUP_TYPE_PARALLEL | | | +| | | | | +---------------------------------------------------+-----------------------------------+ | | +| | | +-----------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------+ | +| | | +---------------------+---------------------+ | +| | | | vid | rid | | +| | | +=====================+=====================+ | +| | | | oid:0x7000000000600 | oid:0x100000007 | | +| | | +---------------------+---------------------+ | +| | | | oid:0xc000000000602 | oid:0x100010000000c | | +| | | +---------------------+---------------------+ | +| | | | oid:0xc000000000601 | oid:0x10000000c | | +| | | +---------------------+---------------------+ | +| | | | oid:0xb0000000005f7 | oid:0x10000000b | | +| | | +---------------------+---------------------+ | +| | | | oid:0xb0000000005f5 | oid:0xb | | +| | | +---------------------+---------------------+ | ++------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +``` + +### 3.2 ACL Rule + +ACL Rules configuration resides in CONFIG DB in table *ACL_RULE*. This information is dumped from CONFIG DB. Orchagent processes *ACL_RULE* configuration and manages the following ASIC resources: + - *SAI_OBJECT_TYPE_ACL_ENTRY* + - *SAI_OBJECT_TYPE_ACL_COUNTER* + - *SAI_OBJECT_TYPE_ACL_RANGE* + +The mapping from CONFIG DB to ASIC DB data is done using the following schema: + +```mermaid +flowchart LR + ACL_RULE --> ACL_COUNTER_RULE_MAP + ACL_COUNTER_RULE_MAP --> COUNTER_OID + COUNTER_OID --> RULE_OID + RULE_OID --> RANGE_OID +``` + +*NOTE*: Mirror rules might be not present in ASIC DB depending on the mirror session state. + +Example: +``` +admin@sonic:~$ dump state acl_rule 'DATA_L3|R1' -t ++-----------------+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| acl_rule_name | DB_NAME | DUMP | ++=================+===========+==========================================================================================================================================================+ +| DATA_L3|R1 | CONFIG_DB | +---------------------+---------------------------------+ | +| | | | Keys | field-value pairs | | +| | | +=====================+=================================+ | +| | | | ACL_RULE|DATA_L3|R1 | +-------------------+---------+ | | +| | | | | | field | value | | | +| | | | | |-------------------+---------| | | +| | | | | | L4_DST_PORT_RANGE | 90-95 | | | +| | | | | | L4_SRC_PORT_RANGE | 80-100 | | | +| | | | | | PACKET_ACTION | FORWARD | | | +| | | | | | PRIORITY | 9995 | | | +| | | | | +-------------------+---------+ | | +| | | +---------------------+---------------------------------+ | ++-----------------+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| DATA_L3|R1 | ASIC_DB | +------------------------------------------------------------+-----------------------------------------------------------------------------------------+ | +| | | | Keys | field-value pairs | | +| | | +============================================================+=========================================================================================+ | +| | | | ASIC_STATE:SAI_OBJECT_TYPE_ACL_COUNTER:oid:0x9000000000606 | +------------------------------------------+---------------------+ | | +| | | | | | field | value | | | +| | | | | |------------------------------------------+---------------------| | | +| | | | | | SAI_ACL_COUNTER_ATTR_ENABLE_BYTE_COUNT | true | | | +| | | | | | SAI_ACL_COUNTER_ATTR_ENABLE_PACKET_COUNT | true | | | +| | | | | | SAI_ACL_COUNTER_ATTR_TABLE_ID | oid:0x7000000000600 | | | +| | | | | +------------------------------------------+---------------------+ | | +| | | +------------------------------------------------------------+-----------------------------------------------------------------------------------------+ | +| | | | ASIC_STATE:SAI_OBJECT_TYPE_ACL_ENTRY:oid:0x8000000000609 | +-----------------------------------------+-------------------------------------------+ | | +| | | | | | field | value | | | +| | | | | |-----------------------------------------+-------------------------------------------| | | +| | | | | | SAI_ACL_ENTRY_ATTR_ACTION_COUNTER | oid:0x9000000000606 | | | +| | | | | | SAI_ACL_ENTRY_ATTR_ACTION_PACKET_ACTION | SAI_PACKET_ACTION_FORWARD | | | +| | | | | | SAI_ACL_ENTRY_ATTR_ADMIN_STATE | true | | | +| | | | | | SAI_ACL_ENTRY_ATTR_FIELD_ACL_RANGE_TYPE | 2:oid:0xa000000000607,oid:0xa000000000608 | | | +| | | | | | SAI_ACL_ENTRY_ATTR_PRIORITY | 9995 | | | +| | | | | | SAI_ACL_ENTRY_ATTR_TABLE_ID | oid:0x7000000000600 | | | +| | | | | +-----------------------------------------+-------------------------------------------+ | | +| | | +------------------------------------------------------------+-----------------------------------------------------------------------------------------+ | +| | | | ASIC_STATE:SAI_OBJECT_TYPE_ACL_RANGE:oid:0xa000000000607 | +--------------------------+--------------------------------------+ | | +| | | | | | field | value | | | +| | | | | |--------------------------+--------------------------------------| | | +| | | | | | SAI_ACL_RANGE_ATTR_LIMIT | 80,100 | | | +| | | | | | SAI_ACL_RANGE_ATTR_TYPE | SAI_ACL_RANGE_TYPE_L4_SRC_PORT_RANGE | | | +| | | | | +--------------------------+--------------------------------------+ | | +| | | +------------------------------------------------------------+-----------------------------------------------------------------------------------------+ | +| | | | ASIC_STATE:SAI_OBJECT_TYPE_ACL_RANGE:oid:0xa000000000608 | +--------------------------+--------------------------------------+ | | +| | | | | | field | value | | | +| | | | | |--------------------------+--------------------------------------| | | +| | | | | | SAI_ACL_RANGE_ATTR_LIMIT | 90,95 | | | +| | | | | | SAI_ACL_RANGE_ATTR_TYPE | SAI_ACL_RANGE_TYPE_L4_DST_PORT_RANGE | | | +| | | | | +--------------------------+--------------------------------------+ | | +| | | +------------------------------------------------------------+-----------------------------------------------------------------------------------------+ | +| | | +---------------------+--------------------+ | +| | | | vid | rid | | +| | | +=====================+====================+ | +| | | | oid:0x9000000000606 | oid:0x600000070009 | | +| | | +---------------------+--------------------+ | +| | | | oid:0x8000000000609 | oid:0x100010008 | | +| | | +---------------------+--------------------+ | +| | | | oid:0xa000000000607 | oid:0xa | | +| | | +---------------------+--------------------+ | +| | | | oid:0xa000000000608 | oid:0x20000000a | | +| | | +---------------------+--------------------+ | ++-----------------+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------+ +``` + +## 4 **Unit Tests**: | S.No | Test case synopsis | |------|-----------------------------------------------------------------------------------------------------------------------------------------| @@ -798,10 +1000,10 @@ Return Dict: | 3 | Verify all the options in the CLI is working as expected | | 4 | Verify the namespace arg is working as expected | | 5 | Verify dump cli options are working as expected | -| 6 | Unit tests should be added for every new module added | +| 6 | Unit tests should be added for every new module added | -## 4 **TechSupport** +## 5 **TechSupport** Output for every which extends from Executor class will be added to the techsupport dump. Every Json file will have the corresponding output: `dump state all -k`. Output will be printed in JSON format for TechSupport Dumps. Only the related keys information will be present in the unified_dump_folder as entire DB dumps are already present in the dump/folder. @@ -815,9 +1017,9 @@ $BASE ├── port ├── ├── ....... - ├── + ├── ├──── etc/ - ├──── log/ + ├──── log/ ├──── ...... ├──── ...... ``` From a8596f654451b29a0558b6576440fa65ef729a76 Mon Sep 17 00:00:00 2001 From: shlomibitton <60430976+shlomibitton@users.noreply.github.com> Date: Wed, 25 May 2022 18:42:34 +0300 Subject: [PATCH 26/60] Fast-reboot Flow Improvements HLD (#980) Signed-off-by: Shlomi Bitton --- doc/fast-reboot/BGP.svg | 4 + .../Fast-reboot_Flow_Improvements_HLD.md | 229 ++++++++++++++++++ doc/fast-reboot/Finalizer.svg | 4 + doc/fast-reboot/Neighbors.svg | 4 + doc/fast-reboot/Orchagent_Syncd.svg | 4 + 5 files changed, 245 insertions(+) create mode 100644 doc/fast-reboot/BGP.svg create mode 100644 doc/fast-reboot/Fast-reboot_Flow_Improvements_HLD.md create mode 100644 doc/fast-reboot/Finalizer.svg create mode 100644 doc/fast-reboot/Neighbors.svg create mode 100644 doc/fast-reboot/Orchagent_Syncd.svg diff --git a/doc/fast-reboot/BGP.svg b/doc/fast-reboot/BGP.svg new file mode 100644 index 0000000000..7d640569cb --- /dev/null +++ b/doc/fast-reboot/BGP.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/doc/fast-reboot/Fast-reboot_Flow_Improvements_HLD.md b/doc/fast-reboot/Fast-reboot_Flow_Improvements_HLD.md new file mode 100644 index 0000000000..f7b044b82e --- /dev/null +++ b/doc/fast-reboot/Fast-reboot_Flow_Improvements_HLD.md @@ -0,0 +1,229 @@ +# Fast-reboot Flow Improvements HLD + +# Table of Contents +- [Fast-reboot Flow Improvements HLD](#fast-reboot-flow-improvements-hld) +- [Table of Contents](#table-of-contents) +- [List of Figures](#list-of-figures) +- [1 Overview](#1-overview) +- [2 Functional Requirements](#2-functional-requirements) +- [3 Use Cases](#3-use-cases) + - [3.1 In-Service restart and upgrade](#31-in-service-restart-and-upgrade) + - [3.2 In-Service restart and upgrade from a vendor NOS to SONiC NOS](#32-in-service-restart-and-upgrade-from-a-vendor-nos-to-sonic-nos) +- [4 Reconciliation at syncd](#4-reconciliation-at-syncd) + - [4.1 Orchagent Point Of View](#41-orchagent-point-of-view) + - [4.2 Syncd Point Of View - INIT/APPLY view framework](#42-syncd-point-of-view---initapply-view-framework) + - [4.3 neighsyncd Point Of View](#43-neighsyncd-point-of-view) + - [4.4 fpmsyncd Point Of View](#44-fpmsyncd-point-of-view) + - [4.5 Reboot finalizer](#45-reboot-finalizer) +- [5 SONiC Application Extension Infrastructre Integration](#5-sonic-application-extension-infrastructre-integration) + +# List of Figures +* [Syncd and Orchagent](#42-syncd-point-of-view---initapply-view-framework) +* [Neighbors](#43-neighsyncd-point-of-view) +* [BGP](#44-fpmsyncd-point-of-view) +* [Finalizer](#45-reboot-finalizer) + +# 1 Overview + +The goal of SONiC fast-reboot is to be able to restart and upgrade SONiC software with a data plane disruption less than 30 seconds and control plane less than 90 seconds. +With current implementation there is no indication of the fast-reboot status, meaning we don't have a way to determine if the flow has finished or not. +Some feature flows in SONiC are delayed with a timer to keep the CPU dedicated to the fast-reboot init flow for best perforamnce, like enablement of flex counters. +In order to have such indicator, re-use of the fastfast-reboot infrastructure can be used. + +Each network application will experience similar processing flow. +Application and corresponding orchagent sub modules need to work together to restore the preboot state and push it to the ASIC. +Take neighbor as an example, upon restart operation every neighbor we had prior to the reboot should be created again after resetting the ASIC. +We should also synchronize the actual neighbor state after recovering it, the MAC of the neighbor could have changed, went down for some reason etc. +In this case, restore_neighbors.py script will align the network state with the switch state by sending ARP/NDP to all known neighbors prior the reboot. +neighsyncd will update the internal cache with all neighbors and push all to APP DB, orchagent will then add/remove/update any neighbor and get syncd to program the HW with the new data. + +In addition to the recover mechanism, the warmboot-finalizer can be enhanced to finalize fast-reboot as well and introduce a new flag indicating the process is done. +This new flag can be used later on for any functionality, we want to start only after init flow finished in case of fast-reboot. +This is to prevent interference in the fast-reboot reconciliation process and impair the performance, for example enablement of flex counters. + +References: +https://github.com/Azure/SONiC/blob/master/doc/fast-reboot/fastreboot.pdf +https://github.com/Azure/sonic-swss/blob/master/neighsyncd/restore_neighbors.py +https://github.com/Azure/sonic-buildimage/blob/master/dockers/docker-orchagent/enable_counters.py + +# 2 Functional Requirements + +The new Fast-reboot design should meet the following requirments: + +- Reboot the switch into a new SONiC software version using kexec - less than 5 seconds. +- Upgrade the switch FW by the new SONiC image if needed. +- Recover all application's state with the new image to the previous state prior the reboot. +- Recover ASIC state after reset to the previous state prior the reboot. +- Recover the Kernel internal DB state after reset to the previous state prior the reboot. +- Sync the Kernel and ASIC with changes on the network which happen during fast-reboot. +- Control plane downtime will not exceed 90 seconds. +- Data plane downtime will not exceed 30 seconds. + +# 3 Use Cases + +## 3.1 In-Service restart and upgrade + +### SWSS docker + +When swss docker starts with the new kernel, all the port/LAG, vlan, interface, arp and route data should be restored from CONFIG DB, APP DB, Linux Kernel and other reliable sources. There could be ARP, FDB changes during the restart window, proper sync processing should be performed. + +### Syncd docker + +The restart of syncd docker should leave data plane intact until it starts again with the new kernel. After restart, syncd configures the HW with the state prior the reboot by all network applications. + +## 3.2 In-Service restart and upgrade from a vendor NOS to SONiC NOS + +Fast-reboot will finish successfully from a different NOS than SONiC with two possible scenarios: + - Dump files of default gateway, neighbors and fdb tables are provided to the new image in a format that meet the SONiC scheme, as SONiC does prior the reboot. + - On this scenario all should work exacly the same as the switch rebooted from SONiC to SONiC. + + - Dump files of default gateway, neighbors and fdb tables are not provided to the new image as SONiC does prior the reboot. + - On this scenario fast-reboot will finish successfully, but with low performance since all neighbors and fdb entries will be created by the slow path. + +Here are test results for both scenarios tested on a SONiC switch based on 202111 branch hash 339e68e1d, Nvidia SN2700 platform. + + - With dump files: + +``` +2022-05-18 14:48:32 : -------------------------------------------------- +2022-05-18 14:48:32 : Summary: +2022-05-18 14:48:32 : -------------------------------------------------- +2022-05-18 14:48:32 : Longest downtime period was 0:00:28.066813 +2022-05-18 14:48:32 : Reboot time was 0:01:45.150628 +2022-05-18 14:48:32 : Expected downtime is less then 0:00:30 +2022-05-18 14:48:32 : -------------------------------------------------- +2022-05-18 14:48:32 : Additional info: +2022-05-18 14:48:32 : -------------------------------------------------- +2022-05-18 14:48:32 : INFO:10.213.84.185:PortChannel interface state changed 1 times +2022-05-18 14:48:32 : INFO:10.213.84.184:PortChannel interface state changed 1 times +2022-05-18 14:48:32 : INFO:10.213.84.187:PortChannel interface state changed 1 times +2022-05-18 14:48:32 : INFO:10.213.84.186:PortChannel interface state changed 1 times +2022-05-18 14:48:32 : INFO:10.213.84.181:PortChannel interface state changed 1 times +2022-05-18 14:48:32 : INFO:10.213.84.183:PortChannel interface state changed 1 times +2022-05-18 14:48:32 : INFO:10.213.84.182:PortChannel interface state changed 1 times +2022-05-18 14:48:32 : INFO:10.213.84.188:PortChannel interface state changed 1 times +2022-05-18 14:48:32 : -------------------------------------------------- +2022-05-18 14:48:32 : ================================================== +``` + + - With no dump files: + +``` +2022-05-18 15:56:33 : -------------------------------------------------- +2022-05-18 15:56:33 : Summary: +2022-05-18 15:56:33 : -------------------------------------------------- +2022-05-18 15:56:33 : Longest downtime period was 0:00:25.112824 +2022-05-18 15:56:33 : Reboot time was 0:01:36.778029 +2022-05-18 15:56:33 : Expected downtime is less then 0:00:30 +2022-05-18 15:56:33 : -------------------------------------------------- +2022-05-18 15:56:33 : Additional info: +2022-05-18 15:56:33 : -------------------------------------------------- +2022-05-18 15:56:33 : INFO:10.213.84.185:PortChannel interface state changed 1 times +2022-05-18 15:56:33 : INFO:10.213.84.184:PortChannel interface state changed 1 times +2022-05-18 15:56:33 : INFO:10.213.84.187:PortChannel interface state changed 1 times +2022-05-18 15:56:33 : INFO:10.213.84.186:PortChannel interface state changed 1 times +2022-05-18 15:56:33 : INFO:10.213.84.181:PortChannel interface state changed 1 times +2022-05-18 15:56:33 : INFO:10.213.84.183:PortChannel interface state changed 1 times +2022-05-18 15:56:33 : INFO:10.213.84.182:PortChannel interface state changed 1 times +2022-05-18 15:56:33 : INFO:10.213.84.188:PortChannel interface state changed 1 times +2022-05-18 15:56:33 : -------------------------------------------------- +2022-05-18 15:56:33 : -------------------------------------------------- +2022-05-18 15:56:33 : Fails: +2022-05-18 15:56:33 : -------------------------------------------------- +2022-05-18 15:56:33 : FAILED:dut:Total downtime period must be less then 0:00:30 seconds. It was 48.5044789314 +2022-05-18 15:56:33 : ================================================== +``` + +A proper automatic functional test case covering the scenario of vendor NOS to SONiC NOS reboot should be implemented as part of this feature. +The test will simulate such scenario by dropping the dump files and perform fast-reboot without it. + +# 4 Reconciliation at syncd + +## 4.1 Orchagent Point Of View + +If dump files provided by the previous image prior the reboot, all tables should be pushed to APP DB for reconciling orchagent. +If no dumps are provided, orchagent will reconcile with no information from prior the reboot. +On this case all ARP and FDB entries will be created by the slow path, meaning ARP packets will exchange between the switch and the neighbors and will be created according to the neighbors response, from kernel to the ASIC. +Same for FDB entries which will be created by the kernel as well, depends on the traffic flowing through the switch. +When orchagent starts with the new SONiC image, the same infrastructure we use to reconcile fastfast-boot will start. +After INIT_VIEW and create_switch functions sent to syncd (reset of the ASIC took place here), 'warmRestoreAndSyncUp' will be executed. +This function will populate m_toSync with all tasks for syncd, by APP DB and CONFIG DB prior the reboot. +To verify orchagent reached the same state as before the reboot, 'warmRestoreValidation' will verify no pending tasks left in the queue, meaning all proccessed succesfully and in the pipeline for syncd to configure the HW. +At the end APPLY_VIEW will be sent to syncd to finalize the process, from this point orchagent enter the main loop and operates normally. + +### NOTICE + +'warmRestoreValidation' might fail the operation just like in fastfast-reboot case, if the way orchagent process an event from the DB is handled differently with the new software version the task will fail to execute and fast-reboot will fail along with it. +This is solvable by the db migrator. + +## 4.2 Syncd Point Of View - INIT/APPLY view framework + +Syncd starts with the fast-reboot flag, trigger the ASIC reset when create_switch is requested from orchagent. +In addition, on this case temp view flag will set to false since it is not required, no comparison logic needed since current view is empty. +Basically INIT and APPLY view requests from orchagent are ignored by syncd, but bound the process from start to end. +During reconsilations process of orchagent, syncd will recieve all tasks to restore the previous state. +All other network applications will do the same as we do today for warm-reboot. + +![Syncd](/doc/fast-reboot/Orchagent_Syncd.svg) + +## 4.3 neighsyncd Point Of View + +Neighbors configuration is a crucial part of the L3 switch software. It is best when the neighbor configuration on the hardware is in sync with the actual switch neighbors on the network. It can't be assumed that neighbors won't change during warm restart window, while the software is restarting, the SONiC switch software has to be ready for scenarios in which during the restart window: + - Existing neighbors went down, e.g: VMs crashed on the server connected to ToR switch which undergoes fast-reboot. + - New neighbors appeared on the network, e.g: VMs created on the server connected to ToR switch which undergoes fast-reboot. + - MAC changes, e.g: VMs re-created or re-configured on the server connected to ToR switch which undergoes fast-reboot. + +![Neighbors](/doc/fast-reboot/Neighbors.svg) + +## 4.4 fpmsyncd Point Of View + + - When BGP on a router restarts, all the BGP peers detect that the session went down and then came up. This "down/up" transition results in a "routing flap" and causes BGP route re-computation, generation of BGP routing updates, and unnecessary churn to the forwarding tables. + - BGP capability, termed "Graceful Restart Capability", is defined that would allow a BGP speaker to express its ability to preserve forwarding state during BGP restart. + - An UPDATE message with no reachable Network Layer Reachability Information (NLRI) and empty withdrawn NLRI is specified as the End-of-RIB marker that can be used by a BGP speaker to indicate to its peer the completion of the initial routing update after the session is established. + +![BGP](/doc/fast-reboot/BGP.svg) + +## 4.5 Reboot finalizer + +Today we have a tool used for warm-reboot to collect all reconsiliation flags from the different network applications. +This tool can be enhanced to consider fast-reboot as well and introduce a new flag indicating the end of the process. +This flag can be used to trigger any flow or application we want to delay until init flow has finished. + +![Finalizer](/doc/fast-reboot/Finalizer.svg) + +# 5 SONiC Application Extension Infrastructre Integration + +A SONiC package can specify an order of shutdown on fast-reboot for a service. A "bgp" may specify "radv" in this field in order to avoid radv to announce departure and cause hosts to lose default gateway, while "teamd" service has to stop before "syncd", but after "swss" to be able to send the last LACP PDU through CPU port right before CPU port becomes unavailable. + +The fast-reboot service shutdown script has to be auto-generated from a template /usr/share/sonic/templates/fast-shutdown.sh.j2. The template is derived from the fast-reboot script from sonic-utlities. + +A services shutdown is an ordered executions of systemctl stop {{ service }} commands with an exception for "swss" service after which a syncd pre-shutdown is requested and database backup is prepared for next boot. A service specific actions that are executed on fast-shutdown are hidden inside the service stop script action. + +NOTE: the assumption here is that syncd pre-shutdown is bound to swss service stop when swss service is doing system level shutdown. + +The *-shutdown.sh are imported and executed in corresponding *-reboot scripts. + +###### fast-shutdown.sh.j2 snippet +``` +... +{% for service in shutdown_orider %} +systemctl stop {{ service }} +{% endfor %} +... +``` + +reboot-finalizer.sh (warm-finalizer.sh) script must also be templatized and updated based on process reconciles flag. + +###### manifest path + +| Path | Value | Mandatory | Description | +| ----------------------------- | --------------- | --------- | -------------------------------------------------------------------------------------------------------------------- | +| /service/fast-shutdown/ | object | no | Fast reboot related properties. Used to generate the fast-reboot script. | +| /service/fast-shutdown/after | lits of strings | no | Same as for warm-shutdown. | +| /service/fast-shutdown/before | lits of strings | no | Same as for warm-shutdown. | +| /processes | object | no | Processes infromation | +| /processes/[name]/reconciles | boolean | no | Wether process performs warm-boot reconciliation, the warmboot-finalizer service has to wait for. Defaults to False. | + + +This chapter it taken from SONiC Application Extension Infrastructure HLD: +https://github.com/Azure/SONiC/blob/master/doc/sonic-application-extension/sonic-application-extention-hld.md#warmboot-and-fastboot-design-impact diff --git a/doc/fast-reboot/Finalizer.svg b/doc/fast-reboot/Finalizer.svg new file mode 100644 index 0000000000..1decb1a38a --- /dev/null +++ b/doc/fast-reboot/Finalizer.svg @@ -0,0 +1,4 @@ + + + +
fpmsyncd
fpmsyncd
neighsyncd
neighsyncd
Redis DB
Redis DB
Reboot Reconciliation Table
Reboot Reconciliation Table
SWSS
SWSS
1. Collect all flags
2. Push finalizer flag
1. Collect all flags...
Reboot
Finalizer
Reboot...
Enable
Counters
Enable...
FlexCounterOrch
FlexCounterOrch
1.Send orchagent reconsiled flag
2. Receive reboot finalizer event
1.Send orchagent reconsiled fla...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/doc/fast-reboot/Neighbors.svg b/doc/fast-reboot/Neighbors.svg new file mode 100644 index 0000000000..193119e839 --- /dev/null +++ b/doc/fast-reboot/Neighbors.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/doc/fast-reboot/Orchagent_Syncd.svg b/doc/fast-reboot/Orchagent_Syncd.svg new file mode 100644 index 0000000000..563c956a4e --- /dev/null +++ b/doc/fast-reboot/Orchagent_Syncd.svg @@ -0,0 +1,4 @@ + + + +
fast-reboot script
fast-reboot scri...
kexec
kexec
Redis DB
Load DB
Load DB
orchagent
Success
Success
Take DB dump
Take DB dump
Success
Success
Stop services
Stop services
syncdASIC
New kernel
New kernel
INIT_VIEW
INIT_VIEW
Success
Success
APP + CONFIG DB
APP + CONFIG DB
create_switch
create_switch
Success
Success
SAIRedis tasks
SAIRedis tasks
SAI API's
SAI API's
Success
Success
Success
Success
APPLY_VIEW
APPLY_VIEW
Restore Validation
Restore Va...
Reconsiliation flag
Reconsiliation flag
Text is not SVG - cannot display
\ No newline at end of file From 6101390938f191aac8598ef4c0258ec892918b89 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Mon, 23 May 2022 20:29:54 -0700 Subject: [PATCH 27/60] updates: add IPinIP tunnel; add DB changes; add active-standby comparison; re-add default route in decision table; add content table; add flow diagrams. --- doc/dualtor/active_active_hld.md | 248 +++++++++++++++----- doc/dualtor/image/decision_table.png | Bin 19908 -> 27183 bytes doc/dualtor/image/difference.png | Bin 0 -> 30622 bytes doc/dualtor/image/orchagent.png | Bin 0 -> 30080 bytes doc/dualtor/image/state_transition_flow.png | Bin 0 -> 30376 bytes doc/dualtor/image/tunnel.png | Bin 0 -> 29890 bytes 6 files changed, 194 insertions(+), 54 deletions(-) create mode 100644 doc/dualtor/image/difference.png create mode 100644 doc/dualtor/image/orchagent.png create mode 100644 doc/dualtor/image/state_transition_flow.png create mode 100644 doc/dualtor/image/tunnel.png diff --git a/doc/dualtor/active_active_hld.md b/doc/dualtor/active_active_hld.md index 97dd1a7153..5f670b34c4 100644 --- a/doc/dualtor/active_active_hld.md +++ b/doc/dualtor/active_active_hld.md @@ -11,23 +11,41 @@ Active-active dual ToR link manager is an evolution of active-standby dual ToR l ## Scope This document provides the high level design of SONiC dual toR solution, supporting active-active setup. -## Server requirements -For active-active setup, some complexity is transferred from smart y-cable to server side. Each server will have a Network Interface Card (NIC) connected to 2 x 100Gbps uplinks. These uplinks will be connected to 2 different ToRs with Direct Attach Copper (DAC) Cable. No Y-cable is needed any more. - -For active-active setup, the requirements for server side are: -1. Server NIC is responsible to deliver southbound (tier 0 device to server) traffic from either uplinks to applications running on server host. - * ToRs are presenting same IP, same MAC to server on both links. -1. Server NIC is responsible to dispense northbound (server to tier 0) traffic between two active links: at IO stream (5 tuples) level. Each stream will be dispatched to one of the 2 uplinks until link state changes. -1. Server should provide support for ToR to control traffic forwarding, and follow this control when dispensing traffic. - * gRPC is introduced for this requirement. - * Each ToR will have a well-known IP. Server NIC should dispatch gRPC replies towards these IPs to the corresponding uplinks. -1. Server should replicate the northbound traffic to both ToRs: - * Specified ICMP replies (for probing link health status) - * ARP propagation - * Neighbor advertisements - - -## Cluster Topology +## Content +[1 Cluster Topology](#active_active_hld.md#1-cluster-topology) + +[2 Requrement Overview](#2-requrement-overview) + - [2.1 Server Requirements](#21-server-requirements) + - [2.2 SONiC Requirements](#22-sonic-requirements) + +[3 SONiC ToR Controlled Solution](#3-sonic-tor-controlled-solution) + - [3.1 IP Routing](#31-ip-routing) + - [3.1.1 Normal Scenario](#311-normal-scenario) + - [3.1.2 Server Uplink Issue](#312-server-uplink-issue) + - [3.1.3 ToR Failure](#313-tor-failure) + - [3.1.4 Comparison to Active-Standby ](#314-comparison-to-active-standby) + - [3.2 DB Schema Changes](#32-db-schema-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.3 Linkmgrd](#33-linkmgrd) + - [3.3.1 Link Prober](#331-link-prober) + - [3.3.2 Link State](#332-link-state) + - [3.3.3 Admin Forwarding State](#333-admin-forwarding-state) + - [3.3.4 Acitve-Active State Machine](#334-acitve-active-state-machine) + - [3.3.5 Default gateway to T1](#335-default-gateway-to-t1) + - [3.3.6 Incremental Featrues](#336-incremental-featrues) + - [3.4 Orchagent](#34-orchagent) + - [3.4.1 IPinIP tunnel](#341-ipinip-tunnel) + - [3.4.2 Flow Diagram and Orch Components](#342-flow-diagram-and-orch-components) + - [3.5 Transceiver Daemon](#35-transceiver-daemon) + - [3.5.1 Cable Control through gRPC](#351-cable-control-through-grpc) + - [3.6 State Transition Flow](#36-state-transition-flow) + - [3.7 Command Line](#37-command-line) + +[4 Warm Reboot Support](#4-warm-reboot-support) + +## 1 Cluster Topology There are a certain number of racks in a row, each rack will have 2 ToRs, and each row will have 8 Tier One (T1s) network devices. Each server will have a NIC connected to 2 ToRs with 100 Gbps DAC cables. In this design: @@ -37,14 +55,77 @@ In this design: ![image info](./image/cluster_topology.png) -### Bandwidth +__Bandwidth__ Each ToR will have single port-channel to each T1. The port-channel will have 2 members of 100Gbps. Therefore, each T0 will have total of 8\*2\*100 Gbps = 1.6 Tbps to all T1s. T1s will have 8 uplinks to T2s. Therefore, total T1s uplink will be 64. Total uplink bandwidth is 6.4Tbps. +## 2 Requrement Overview +### 2.1 Server Requirements + Each server will have a Network Interface Card (NIC) connected to 2 x 100Gbps uplinks. These uplinks will be connected to 2 different ToRs with Direct Attach Copper (DAC) Cable. No Y-cable is needed any more. Hence, some complexity is transferred from smart y-cable to server side. + +For active-active setup, the requirements for server side are: +1. Server NIC is responsible to deliver southbound (tier 0 device to server) traffic from either uplinks to applications running on server host. + * ToRs are presenting same IP, same MAC to server on both links. +1. Server NIC is responsible to dispense northbound (server to tier 0) traffic between two active links: at IO stream (5 tuples) level. Each stream will be dispatched to one of the 2 uplinks until link state changes. +1. Server should provide support for ToR to control traffic forwarding, and follow this control when dispensing traffic. + * gRPC is introduced for this requirement. + * Each ToR will have a well-known IP. Server NIC should dispatch gRPC replies towards these IPs to the corresponding uplinks. +1. Server should replicate these northbound traffic to both ToRs: + * Specified ICMP replies (for probing link health status) + * ARP propagation + * IPv6 router solicitation, neighbor solicitation and neighbor advertisements + + Check pseudo code below for details of IO scheduling contract. + ``` + // gRPC Response + if (ethertype == IPv4 && DestIP == Loopback3_Port0_IPv4) or (ethertype == IPv6 && DestIP == Loopback3_Port0_IPv6) + { + if (Port 0.LinkState == Up) + Send to Port 0 + else + Drop + } + else if (ethertype == IPv4 && DestIP == Loopback3_Port1_IPv4) or (ethertype == IPv6 && DestIP == Loopback3_Port1_IPv6) + { + if (Port 1.LinkState == Up) + Send to Port 1 + else + Drop + } + + // ARP + else if (ethertype == ARP) + Duplicate to both ports + + // ICMP Heartbeat Probing + else if ((ethertype == IPv4 && DestIP == Loopback2_IPv4 && IPv4.Protocol == ICMP) or (ethertype == IPv6 && DestIP == Loopback2_IPv6 && IPv6.Protocol == ICMPv6)) + Duplicate to all active ports + + // IPv6 router solicitation, neighbor solicitation and neighbor advertisements + else if (ethertype == IPv6 && IPv6.Protocol == ICMPv6 && ICMPv6.Type in [133, 135, 136]) + Duplicate to both ports + else if (gRPC status == "Port 0 disabled" || Port0.LinkState == Down) + Send to Port 1 + else if (gRPC status == "Port 1 disabled" || Port1.LinkState == Down) + Send to Port 0 + + // Other Traffic + else + Send packet on either port + ``` + +### 2.2 SONiC Requirements +1. Introduce active-active mode into MUX state machine. +1. Probe to determine if link is healthy or not. +1. Signal NIC if ToR is switching active or standby. +1. Rescue when peer ToR failure occures. +1. Unblock traffic when cable control channel is unreachable. + +## 3 SONiC ToR Controlled Solution -## SONiC ToR Controlled Solution -### Normal Scenario +### 3.1 IP Routing +#### 3.1.1 Normal Scenario Both T0s are up and functioning and both the server NIC connections are up and functioning. * Control Plane UT0 and LT0 will advertise same VLAN (IPv4 and IPv6) to upstream T1s. Each T1 will see there are 2 available next hops for the VLAN. T1s advertise to T2 as normal. @@ -61,7 +142,7 @@ Both T0s are up and functioning and both the server NIC connections are up and f * NIC determines which link to use and sends all the packet on a flow using the same link. * T0 sends the traffic to destination server if T0 has learnt the MAC address of the destination server. -### Server Uplink Issue +#### 3.1.2 Server Uplink Issue Both T0s are up and functioning and some servers NIC are only connected to 1 ToR (due to cable issue, or the cable is taken out for maintenance). * Control Plane No change from the normal case. @@ -69,7 +150,7 @@ No change from the normal case. * Traffic to the server * Traffic lands on any of the T1 by ECMP from T2s. * T1 forwards traffic to either of the T0s by ECMP. - * **If T0 does not have the downlink to the server, T0 will send the traffic to the peer T0 over VxLAN encap via T1s.** + * **If T0 does not have the downlink to the server, T0 will send the traffic to the peer T0 over IPinIP encap via T1s.** * T0 sends the traffic to the server and NIC delivers traffic up the stack. * Traffic from the server to outside the cluster * T0 will signal to NIC which side to use. @@ -78,10 +159,10 @@ No change from the normal case. * Traffic from the server to within the cluster * T0 will signal to NIC which side to use. * NIC determines which link to use and sends all the packets on a flow using the same link. If Server NIC has only 1 connection up, all traffic will be on this connection - * If T0 does not have the downlink to the server, T0 will send the traffic to the peer T0 over VxLAN encap via T1s. + * If T0 does not have the downlink to the server, T0 will send the traffic to the peer T0 over IPinIP encap via T1s. * T0 sends the traffic to the server. -### ToR Failure +#### 3.1.3 ToR Failure Only 1 T0s is up and functioning. * Control Plane Only 1 T0 will advertise the VLAN (IPv4 and v6) to upstream T1s. @@ -97,22 +178,47 @@ Only 1 T0 will advertise the VLAN (IPv4 and v6) to upstream T1s. * T0 will signal to NIC which side to use. * T0 sends the traffic to the server. -Highlight on the difference with Active-Standby: -1. In active-standby dual ToR design, traffic from server is duplicate to both T0s, standby ToR needs to drop the packets. In active-active, NIC will determine which link to use if both are available. -1. In active-ative design, servers have up to 2 links for traffic, T1s and above devices will see more throughput from server. - -## Linkmgrd +#### 3.1.4 Comparison to Active-Standby +Highlight on the common and differences with Active-Standby: + ![comparison](./image/difference.png) + +### 3.2 DB Schema Changes +#### 3.2.1 Config DB +* New field in `MUX_CABLE` table to determine cable type +``` +MUX_CABLE|PORTNAME: + cable_type: active-standby|active-active +``` +#### 3.2.2 App DB +* New table to invoke transceiver daemon to query server side forwarding state +``` +FORWARDING_STATE_COMMAND | PORTNAME: + command: probe | set_active_self | set_standby_self | set_standby_peer +FORWARDING_STATE_RESPONSE | PORTNAME: + response: active | standby | unknown | error + response_peer: active | standby | unknown | error +``` +* New table for transceiver daemon to write peer link state to linkmgrd +``` +PORT_TABLE_PEER|PORTNAME + oper_status: up|down +``` +* New table to invoke transceiver daemon to set peer's server side forwarding state +``` +HW_FORWARDING_STATE_PEER|PORTNAME + state: active|standby|unknown +``` +#### 3.2.3 State DB +* New table for transceiver daemon to write peer's server side forwarding state to linkmgrd +``` +HW_MUX_CABLE_TABLE_PEER| PORTNAME + state: active |standby|unknown +``` + +### 3.3 Linkmgrd Linkmgrd will provide the determination of a ToR / link's readiness for use. -### Requirement -1. Introduce active-active mode into MUX state machine. -1. Probe to determine if link is healthy or not. -1. Signal NIC if ToR is switching active or standby. -1. Rescue when peer ToR failure occures. -1. Unblock traffic when cable control channel is unreachable. - -### Solution -* Link Prober +#### 3.3.1 Link Prober Linkmgrd will keep the link prober design from active-standby mode for monitoring link health status. Link prober will send ICMP packets and listen to ICMP response packets. ICMP packets will contain payload information about the ToR. ICMP replies will be duplicated to both ToRs from the server, hence a ToR can monitor the health status of its peer ToR as well. Link Prober will report 4 possible states: @@ -121,6 +227,8 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. * LinkProberPeerUnknown: It indicates that LinkMgr did not receive ICMP replies containing ID of the peer ToR. Hence, there is a chance that peer ToR’s link is currently down. * LinkProberPeerAcitve: It indicates that LinkMgr receives ICMP replies containing ID of the peer ToR, or in other words, peer ToR’s links appear to be active. + By default, the heartbeat probing interval is 100 ms. It takes 3 lost of link prober packets, to determine link is unhealthy. Server issue can also cause link prober packet loss, but ToR won't distinguish it from link issue. + __ICMP Probing Format__ The source MAC will be ToR's SVI mac address. Ethernet destination will be the well-known MAC address. Source IP will be ToR's Loopback IP, destination IP will be SoC's IP address, which will be introduced as a field in minigraph. ![icmp_format](./image/icmp_format.png) @@ -128,13 +236,13 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. Linkmgrd also adapt TLV (Type-Length-Value) as the encoding schema in payload for additional information elements, including cookie, version, ToR GUID etc. ![icmp_payload](./image/icmp_payload.png) -* Link State +#### 3.3.2 Link State When link is down, linkmgrd will receive notification from SWSS based on kernel message from netlink. This notification will be used to determine if ToR is healthy. -* Admin Forwarding State +#### 3.3.3 Admin Forwarding State ToRs will signal NIC if the link is active / standby, we will call this active / standby state as admin forwarding state. It's up to NIC to determine which link to use if both are active, but it should never choose to use a standby link. This logic provides ToR more control over traffic forwarding. -* Acitve-Active State Machine +#### 3.3.4 Acitve-Active State Machine Active-acitve state transition logics are simplified compared to active-standby. In active-standby, linkmgrd makes mux toggle decisions based on y-cable direction, while for active-active, two links are more independent. Linkmgrd will only make state transition decisions based on healthy indicators. To be more specific, if link prober indicates active AND link state appears to be up, linkmgrd should determine link's forwarding state as active, otherwise, it should be standby. @@ -147,8 +255,45 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. When control channel is unreachable, ToR won't block the traffic forwarding, but it will periodically check gRPC server's healthiness. It will make sure server side's admin forwarding state aligns with linkmgrd's decision. ![grpc_failure](./image/gRPC_failure.png) -* Cable Control through gRPC - In active-active design, we will use gRPC to do cable control and signal NIC if ToRs is up active. SoC will run a gRPC server. Linkmgrd will determine server side forwarding state based on link prober status and link state. Then linkmgrd can invoke transceiver daemon to update NIC if ToRs are active through gRPC calls. +#### 3.3.5 Default gateway to T1 + If default gateway to T1 is missing, dual ToR system can suffer from northbound packet loss, hence linkmgrd also monitors defaul route state. If default route is missing, linkmgrd will stop sending ICMP probing request and fake an unhealthy status. This functionality can be disabled as well, the details is included in [default_route](https://github.com/Azure/sonic-linkmgrd/blob/master/doc/default_route.md). + + To summarize the state transition decision we talk about, and the corresponding gRPC action to take, we have this decision table below: + ![icmp_payload](./image/decision_table.png) + +#### 3.3.6 Incremental Featrues + +* Link Prober Packet Loss Statics + Link prober will by default send heartbeat packet every 100 ms, the packet loss statics can be a good measurement of system healthiness. An incremental feature is to collect the packet loss counts, start time and end time. The collected data is stored and updated in state db. User can check and reset through CLI. + +* Supoort for Detachment + User can config linkmgrd to a certain mode, so it won't switch to active / standby based on health indicators. User can also config linkmgrd to a mode, so it won't modify peer's forwarding state. This support will be useful for maintenance, upgrade and testing scenarios. + +### 3.4 Orchagent +#### 3.4.1 IPinIP tunnel +Orchagent will create tunnel at initialization and add / remove routes to forward traffic to peer ToR via this tunnel when linkmgrd switchs state to standby / active. + +Check below for an example of config DB entry and tunnel utilization when LT0's link is having issue. + ![tunnel](./image/tunnel.png) + +#### 3.4.2 Flow Diagram and Orch Components +Major components of Orchagent for this IPinIP tunnel are MuxCfgOrch, TunnelOrch, MuxOrch. + ![tunnel](./image/orchagent.png) + +1. MuxCfgOrch +MuxCfgOrch listens to config DB entries to populate the port to server IP mapping to MuxOrch. + +1. TunnelOrch +TunnelOrch will subscribe to `MUX_TUNNEL` table and create tunnel, tunnel termination, and decap entry. This tunnel object would be created when initializing. This tunnel object would be used as nexthop object by MuxOrch for programming route via SAI_NEXT_HOP_TYPE_TUNNEL_ENCAP. + +1. MuxOrch +MuxOrch will listen to state changes from linkmgrd and does the following at a high-level: + * Enable / disable neighbor entry. + * Add / remove tunnel routes. + +### 3.5 Transceiver Daemon +#### 3.5.1 Cable Control through gRPC + In active-active design, we will use gRPC to do cable control and signal NIC if ToRs is up active. SoC will run a gRPC server. Linkmgrd will determine server side forwarding state based on link prober status and link state. Then linkmgrd can invoke transceiver daemon to update NIC wether ToRs are active or not through gRPC calls. Current defined gRPC services between SoC and ToRs related with linkmgrd cable controlling: * DualToRActive @@ -158,19 +303,14 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. * GracefulRestart 1. Shutdown / restart notification from SoC to ToR. - To summarize the state transition decision we talk about, and the corresponding gRPC action to take, we have this decision table below: - ![icmp_payload](./image/decision_table.png) +### 3.6 State Transition Flow +The following UML sequence illustrates the state transtion when linkmgrd state moves to active. The flow will be similar for moving to standby. -### Incremental Featrues -* Default gateway to T1 - If default gateway to T1 is missing, dual ToR system can suffer from northbound packet loss, hence linkmgrd also monitors defaul route state. If default route is missing, linkmgrd will stop sending ICMP probing request and fake an unhealthy status. This functionality can be disabled as well, the details is included in [default_route](https://github.com/Azure/sonic-linkmgrd/blob/master/doc/default_route.md). +![state transition flow](./image/state_transition_flow.png) -* Link Prober Packet Loss Statics - Link prober will by default send heartbeat packet every 100 ms, the packet loss statics can be a good system healthiness measurement. An incremental feature is to collect the packet loss counts, start time and end time. The collected data is stored and updated in state db. User can check and reset through CLI. - -* Supoort for Detachment - User can config linkmgrd to a certain mode, so it won't switch to active / standby based on health indicators. User can also config linkmgrd to a mode, so it won't modify peer's forwarding state. This support will be useful for maintenance, upgrade and testing scenarios. +### 3.7 Command Line +TBD -### Command Line +## 4 Warm Reboot Support TBD diff --git a/doc/dualtor/image/decision_table.png b/doc/dualtor/image/decision_table.png index 1c9c82e7646ed2ba290025a2685f72a89b940ea8..7776e9c8f2cade252c3afc34d902b071b39faf79 100644 GIT binary patch literal 27183 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 W7x)$-o!d2sA9Xr;gy3-Ir+)*zq%kD` literal 19908 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 MW8ZK2j@}pk1?VwbR{#J2 literal 0 HcmV?d00001 diff --git a/doc/dualtor/image/tunnel.png b/doc/dualtor/image/tunnel.png new file mode 100644 index 0000000000000000000000000000000000000000..d90f0d2e9d1d729241592cda35c1aba9003385c3 GIT binary patch literal 29890 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 Date: Fri, 27 May 2022 16:39:54 -0700 Subject: [PATCH 28/60] replace table images, update requirement overview --- doc/dualtor/active_active_hld.md | 129 ++++++++++++++++++++++++++- doc/dualtor/image/decision_table.png | Bin 27183 -> 0 bytes doc/dualtor/image/difference.png | Bin 30622 -> 0 bytes 3 files changed, 125 insertions(+), 4 deletions(-) delete mode 100644 doc/dualtor/image/decision_table.png delete mode 100644 doc/dualtor/image/difference.png diff --git a/doc/dualtor/active_active_hld.md b/doc/dualtor/active_active_hld.md index 5f670b34c4..c3c9ed7314 100644 --- a/doc/dualtor/active_active_hld.md +++ b/doc/dualtor/active_active_hld.md @@ -62,9 +62,10 @@ T1s will have 8 uplinks to T2s. Therefore, total T1s uplink will be 64. Total up ## 2 Requrement Overview ### 2.1 Server Requirements - Each server will have a Network Interface Card (NIC) connected to 2 x 100Gbps uplinks. These uplinks will be connected to 2 different ToRs with Direct Attach Copper (DAC) Cable. No Y-cable is needed any more. Hence, some complexity is transferred from smart y-cable to server side. +In our cluster setup, as smart y-cable is replaced, some complexity shall be transferred to server NIC. + +Note that, this complexity can be handled by active-active smart cables, or any other deployments, as long as long it meets the requirements below. -For active-active setup, the requirements for server side are: 1. Server NIC is responsible to deliver southbound (tier 0 device to server) traffic from either uplinks to applications running on server host. * ToRs are presenting same IP, same MAC to server on both links. 1. Server NIC is responsible to dispense northbound (server to tier 0) traffic between two active links: at IO stream (5 tuples) level. Each stream will be dispatched to one of the 2 uplinks until link state changes. @@ -180,7 +181,62 @@ Only 1 T0 will advertise the VLAN (IPv4 and v6) to upstream T1s. #### 3.1.4 Comparison to Active-Standby Highlight on the common and differences with Active-Standby: - ![comparison](./image/difference.png) + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Active- StandbyActive-ActiveImplication
Server uplink viewSingle IP, single MAC
Standby side receive trafficForward it to active ToR through IPinIP tunnel via T1
T0 to T1 control planeAdvertise same set of routes
T1 to T0 TrafficECMP
Southbound trafficFrom either side
Northbound trafficAll is duplicated to both ToRs.NiC determines which side to forward the traffic.Orchagent doesn’t need to drop packets on standby side.
BandwidthUp to 1 linkUp to 2 linksT1 and above devices see more throughput from server.
Cable ControlI2CgRPC over DAC cablesControl plane and data plane now share the same link.
### 3.2 DB Schema Changes #### 3.2.1 Config DB @@ -259,7 +315,72 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. If default gateway to T1 is missing, dual ToR system can suffer from northbound packet loss, hence linkmgrd also monitors defaul route state. If default route is missing, linkmgrd will stop sending ICMP probing request and fake an unhealthy status. This functionality can be disabled as well, the details is included in [default_route](https://github.com/Azure/sonic-linkmgrd/blob/master/doc/default_route.md). To summarize the state transition decision we talk about, and the corresponding gRPC action to take, we have this decision table below: - ![icmp_payload](./image/decision_table.png) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputDecision
Default Route to T1Link ProberLink StateLink Manager StategRPC Action to Update Server-Side Admin Forwarding State
SELFPEERSELFPEER
AvailableActiveActiveUpActiveSet to ActiveNo-op
AvailableActiveUnknownSet to standby
AvailableUnknown*UpStandbySet to standbyNo-op
Available**DownStandbySet to standbyNo-op
Missing***StandbySet to standbyNo-op
#### 3.3.6 Incremental Featrues diff --git a/doc/dualtor/image/decision_table.png b/doc/dualtor/image/decision_table.png deleted file mode 100644 index 7776e9c8f2cade252c3afc34d902b071b39faf79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27183 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 W7x)$-o!d2sA9Xr;gy3-Ir+)*zq%kD` diff --git a/doc/dualtor/image/difference.png b/doc/dualtor/image/difference.png deleted file mode 100644 index 52b08e1c5e6752d1cb97b41c807afb1fc90b51b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30622 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 Date: Tue, 31 May 2022 13:50:05 -0700 Subject: [PATCH 29/60] adjust decision table; remove bandwidth calculation as 2 member lags are not hard requirement --- doc/dualtor/active_active_hld.md | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/doc/dualtor/active_active_hld.md b/doc/dualtor/active_active_hld.md index c3c9ed7314..a7f5cee3fa 100644 --- a/doc/dualtor/active_active_hld.md +++ b/doc/dualtor/active_active_hld.md @@ -55,11 +55,6 @@ In this design: ![image info](./image/cluster_topology.png) -__Bandwidth__ -Each ToR will have single port-channel to each T1. The port-channel will have 2 members of 100Gbps. Therefore, each T0 will have total of 8\*2\*100 Gbps = 1.6 Tbps to all T1s. - -T1s will have 8 uplinks to T2s. Therefore, total T1s uplink will be 64. Total uplink bandwidth is 6.4Tbps. - ## 2 Requrement Overview ### 2.1 Server Requirements In our cluster setup, as smart y-cable is replaced, some complexity shall be transferred to server NIC. @@ -324,8 +319,8 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. Default Route to T1 - Link Prober Link State + Link Prober Link Manager State gRPC Action to Update Server-Side Admin Forwarding State @@ -339,9 +334,9 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. Available + Up Active Active - Up Active Set to Active No-op @@ -354,18 +349,18 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. Available + Up Unknown * - Up Standby Set to standby No-op Available + Down * * - Down Standby Set to standby No-op From da2c750940e859bf60ad5639584e6b0f741181af Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Thu, 2 Jun 2022 12:37:36 -0700 Subject: [PATCH 30/60] remove default gateway referrence to avoid confusion --- doc/dualtor/active_active_hld.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/dualtor/active_active_hld.md b/doc/dualtor/active_active_hld.md index a7f5cee3fa..b3881551ef 100644 --- a/doc/dualtor/active_active_hld.md +++ b/doc/dualtor/active_active_hld.md @@ -33,7 +33,7 @@ This document provides the high level design of SONiC dual toR solution, support - [3.3.2 Link State](#332-link-state) - [3.3.3 Admin Forwarding State](#333-admin-forwarding-state) - [3.3.4 Acitve-Active State Machine](#334-acitve-active-state-machine) - - [3.3.5 Default gateway to T1](#335-default-gateway-to-t1) + - [3.3.5 Default route to T1](#335-default-route-to-t1) - [3.3.6 Incremental Featrues](#336-incremental-featrues) - [3.4 Orchagent](#34-orchagent) - [3.4.1 IPinIP tunnel](#341-ipinip-tunnel) @@ -306,8 +306,8 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. When control channel is unreachable, ToR won't block the traffic forwarding, but it will periodically check gRPC server's healthiness. It will make sure server side's admin forwarding state aligns with linkmgrd's decision. ![grpc_failure](./image/gRPC_failure.png) -#### 3.3.5 Default gateway to T1 - If default gateway to T1 is missing, dual ToR system can suffer from northbound packet loss, hence linkmgrd also monitors defaul route state. If default route is missing, linkmgrd will stop sending ICMP probing request and fake an unhealthy status. This functionality can be disabled as well, the details is included in [default_route](https://github.com/Azure/sonic-linkmgrd/blob/master/doc/default_route.md). +#### 3.3.5 Default route to T1 + If default route to T1 is missing, dual ToR system can suffer from northbound packet loss, hence linkmgrd also monitors defaul route state. If default route is missing, linkmgrd will stop sending ICMP probing request and fake an unhealthy status. This functionality can be disabled as well, the details is included in [default_route](https://github.com/Azure/sonic-linkmgrd/blob/master/doc/default_route.md). To summarize the state transition decision we talk about, and the corresponding gRPC action to take, we have this decision table below: From e8ea3bfdd00685a71b3c40557546e25bec80a7b0 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Thu, 2 Jun 2022 12:40:57 -0700 Subject: [PATCH 31/60] update self state machine diagram --- doc/dualtor/image/active_active_self.png | Bin 18423 -> 20580 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/dualtor/image/active_active_self.png b/doc/dualtor/image/active_active_self.png index 0266c40675b8b45cdd7a54e6b334f5dfa95ce5a5..e4e44aa383affea1ea372db12bde7dcf355b9d94 100644 GIT binary patch literal 20580 zcmbrmc|6qZ_dh;b?n0$R+=MpSlS0-RC5cg%?AwIOI!V@;MR!SvDMH!C&SYyab~Ac%mauE2P z_sMNLe-P+cGxr})n{VL*;6uRx1KWUmzK;TeU7kJ!89sgZ@Ug##Z-BGaVc->0s?p8s zmLbmc@u=j}gNd_@?csd(Kl2~w`>)QL1lPmgh+IxRs{Z)PAJmYq{Nw6X)Nl~=hPL3D zQ@loJo*zH+QqRFt8D}hyt4uVuNZjbNwx1YK78rQ*sJ64rki7yWwEx#9Ic z;bFpd@Ai}ci9n#o`uGFf|9OP~1wo*(yOAW-n(?@_0E3ZXM|0U`U{FK>fu6UwFV?XdCJ=PW1 z&WMq5K60(K3vb}t{gnhy)ug8@!z+41;k3_0?KIusNnbkh$dM!CL*1A=1CalWpK@B> z)pC8LJo>c4t72P=>kp|&OZg<(xD;{V0S{jx=$#|=MGwg4r-h(o?ivEq=Ut49J}az_ zga1E1622K-Q^TMtB3umc1NQ%sS=ER!QBFWByk2s9cCxYJ!L*%+6t3zfa^Jr)d&cV< z#Et7txrO}q*ha^MHGpydqiNp7SKw13BC7InmIvm8qw`$34gna*B0=9EmhT+D!h0cW zMY0PzEVqiGUatVmyaPP&|KFHVXIlRR2IA^}K&9*dHKaqiEm!{VyN3VQ1^)kD{)>Yg zwEgLf54)(EcgokAhlpQSX;L3gBq4hf%H$-|E7+}FPVYt+&7$LcTYr@zaJ7}Rr~dmv z0e?hGgVgT5%eraN{@7%3ZY}b;j4Bgm9Zupfj%2GQgb=hOtB@Su zN$tMFCJb9G5*+!%d33xtg?G{kr4jaSsaG8JX?a?-W?k5hCEs;nQ0jPppF_-zLd0H-+CN6#M$vl zEeJ#*wErNX6Xd%FZm|m=5#@%;gy^Qz!%bMj?yiX55w8NQI*g|L*mp&yb9AP}UoeJt zm2Vm*5RncOr$(l0Q?V?3}*ZgW>10Z1}YYE5t=$5X_lt-yYpXRoiRGZqW*1fOXtV}!xp*qB)LsXsS?ts=LT2JRx-+*oU#OFJW{rNLnM=5(lf ze&eGIDVab7YHTZH0Gtt-1kXt9QUVF_k_CIRN-gwT`Vg~MvAYrI?b!gpUVLnYx&Z?#T>6mqK zV{TOp_C>mKFTw{Bv_pB!F8R+o^>5geSd>9^umjKfgQ!@-=ImJm>fl|MvLaT};(12c z*CgFoc-cpss#F4mClgmIb;?=lIcxVABv* zdd6x|bx+7AY~R`((Wr0o71?~b=h&AT%OOwPvyyS4NQyxHEDBwX zI`|gdi{Xw(K3Y(%6t|Jl(xji!(w$CppD=mF$+b2+CGqNkXBGH+YZY#4#<$>i{an4; z7CcLn#=PpKn=(wFavTSpIckTf&Wnh9#W1;~_ruu(i-On$%Nr}0c8Y? z<$+btkLY@y+m+lJLsj_n5i|0kO2BlHZp*Ak(=P-Pml`O$^a8Z6(SKP{^-C?(rs77y z%E;{?o0&CTndWa2ZOv2oeeSyyeHV%$XOfh((i#00+d#a!bHA(V39TcwjqhXZq(XN| zH_FRy5v^mrv@_M|WXH2!u(|O{#Co|S`h4u#(5vU4a~C~qRjhT81ITm5^AcUlyM>=A z&wlufTnz!A7OguTmq8SI)#b$NuI${&hxZ;HpY3nWaum$Z{X1SBUY2ib;rej#9=z?I zB01{gOm6L+A6@aYn2J*3xRFY^#8AOCQWgq24LCm7 zd|+F(Ot<*#5oDQlEp5g44(WAb<4_yi4W+}hlInI=cAGVv{h}PUt0s;Kk!p?W99j(4 zew>43yY&Qx=`Lw7`^&EFI*Otn^JLzZO$wLCf%@9|tKx(q*d?)V%S->*BhTzSES}qD zQtK<~Rpg%pw9PDgI!&_us~!crqbfXtx7KXmT@AEChdeC)Vonlh<7xuxAbeVZftYG1uC_?pqBN_v)5>&S|oDo7(Iv!h9(wwbZe^)KLHMGGa*kbd{7=>iAbpUF%gx?02WsbDu9L z9%HnB5-hflmS(gk6G{lSf_n_G0q)08HNz-Rc7Ba2oNsAS$^^^Z#k*C$rc!@vJIVIE zL@6Z(Ic8L`H>w1r7z~Hh0Tg1&q4W3Fp!k;XR&|kD*Rxcn{Ij{M?iZ#lNtIk_8xkjt zZ*A-{ucRcvtC>|Wsa<5j&n*p;Pi0Lj{aZ+d9q=0hes_cA*=RFAwomV!nPS$oV`I?y z_0zgoq~hJ+SExph;N257cSa2-*3GX8-=Gj{_X0Fj5h{)~PnA}VW;!d5UNSJc#;Xpx zf5luei#|UMXE{i6(%*tl6_9vY?IWhT$6ZEezAoiFX`U_nQNp9jPZk7a4g$|ANt~`b zeyUVEUYB>d6qj0FP}5k=w4IaCflNk!?F>n%bcX z!^hn0Z~8j^WmRURf(~WOc^PSx;se2wsqx60$lqgH`)|t$8#Vw#cKw`gTC~s3lG55U6uV_p)Fho6hq`@7V}Em>$qK6o!t!fW17JnsLmOw8vbn$lDW= zM6y?2s~_fcbKX_&o~@0QwVtaRVB!`nhZVwS#2Q0&5k%lX==eokD(zoM-gt!xKFVP7 zg2W#81GX^qU4Iz-hN$UgQ-0=?I+5|Kw74hKXL7=4ENbqxtLGh>!(@Bjp3F`_JLKX? z)xXZzD+e?#)D1HEGq+3M2;cP%ebtPe7*F8jyw8wl&5!*0iD!b$lpEVFy~HX{V8{Qg z^Dq9}NEmXGHrDF?0}t>d#_cLW&y{b{@3v-M#2`;CdxWhtajiM}lqB@r&C} zP!IQes3RR$5}fo$)AP&jj2_?h-kw-;(LxCC50Cm#5p;P>*E={!M%HR>KtYwbaW#zI zi|8Korn=%bxAO7l=B1jaS9ZD|?7MaRrr#8Uy!V!qW4OYI-4;G}zkKfO38`hB6B(!i znX&Du*3}(0(gjJwArwHCL4NC@Aznu4jZFjGRK9r@hvVf#N^aeNl~gGv1sEDdSjf+x zJDgpUwV0x9qPM7lbWv>}aYD8_v&Sd10FUhJd@;G8wye%0d&jhx{q-;1JIe1BB|i*{ z6CqW5Uf8tZByv1BbaNz|WO~uzz;&T(0Zx#LU(5KSvrW7qdeFCfrX)}q6(X82IR z)(`S!&h+l;;Ow=Rqgcr!FWeXQ8f8GyhEk3F5_w^>%Xd#*?mWghny`G?)A?tm6F#@V zJx@^auQL>xfb{(yaA04)-1ZiT@NKA6X{dP$8wqXz)1K|i{BUvF_q{xs;~&)1^$~oMsUMC(Vw8#!qC&?w{QKGqs`(v!a1er|rwU2W%3(4q@X{ z0{<-XDkB0eVCU(SPqr!B(562;kA{_G-U z+OuElIgvJ}UEwgD6P$NLs$GGpYXY}YFM)y7*-MAL5QlS${K|gP-i8cmlE*8j~&8G|qs>3)Ya2fma z0gd}*FCuH{C(GzZ(6)6lr$xnRA_n_p|3FR_N58Xt*C(G9sjE{vXPvP~u)?<(u8N%` ziZY5t`?}wUgnfG3Tlc=ksrK_!>r7$OrNK+W)}Tui^`E|rvPsb=>Lz%EQYF=PV@0k# zLQ?}0m1_=Cy7KqWHX;4P;tv`ZMakYJiOYq zy;aQA!&&}4m|86>4h=4{pj)`GH_3wLX&^I1!L3`(Fvyq`@tQYu>%p)Y@syr+$PZ@Y zWS0@jB!u8MYwJN&iI&cGox2-rG!FN)#6MtLsR;R2d?;s47I!{R7)P@?O^FpSubip7 zRC-qe@@3Bk9oN`t11T|E_pj!RG*m7@vJ06)uufhOU0(pTwJknA2}xT2RpXa=G(h0Z z%dlCY>C*U!nWAT5LeQI5S+326bF1W7VG(>tSgmV&MbMxSbmN`oxK&>{C3;UbL;1m* z8OuBP+=mL~mO`GR8=k?REz`&YZIqL-{2;n}Z+_0G;hJ?IZD&O@+%;umUatc(a`sqf zFl(ei7tmzE?7A!Y^~ip4F)Kx@lj>6Aa((5(SLBx~ihNpP8VxbY}}mQrx&&$p(BO*Md@1IImB-I`=|G|J;>nK_njexWk_Dn?+Io; zla2~1B`f?kKAA7Uz6q^!IbU1bD}g1NED8fo*W2qN;Bv%}nuxu>Qg4;HQtI6xIx);mMCgpm~zoj{}C=qQx1( zNj~T*v~YNk``n(;&=A3W8kt>_E zEzb3v!ZT*(E(Xt|g@grzWb*ow`;sW7u7zW?&G!mPKB;_J7Sx*^DFx`iU!baMi%Nu@ zShzr(Ydb9~dUGDryas>WdLX>(3O6YIXnLHHbf~fhraW(Y>Z}3pZ{r*=9|83|OY)IC zvU!(wx=K5uTP+(Tf*THYNO=3`>ZDGvh!HY!g; z6|E1TLN{IZ>&^B}lSx-g6c8<&Dm+RuR^dWQM*tM*c*IdqddbSx?V6RJoi0D)rnkjF zCE?moCHX{?69;;UJRpv~NcoCuD4LB&91U-8r702$Ew6AR(jTC|vnFFkgH;-<6aV7% zI2eHzo3O}uWqACi_yN!dZV9>nYSl|ZV>2*h!b3h<#XyQhyU_LHbaBx4Kq*a;U3x9k zW%Eldci7J!Yi3(RZ=3+D4(hKB?Hv7&Xs=7=|Lod*HNQ2Q3d=o~xqa*ijBoRwiFCzV z_PYOZ94SG<|eR|_^D>-O^L`QLHU zJ-(b_Ra_5EDVw1aobU%SuRdwqU-%<9Cak>P1e8)1cK-s`OUd#7?pqLF)S`r*w4o`C zj~3$R24r4XU>!{MoIkHP^dZ~;K=1bhYTyO%iHs1qJMlo~M|BAek>ylsf})AN(sFwL zN%ald?u9!*sut10JeFy%TskK52pxJEwy(zo0;`0K4Njr!bK4>ywH`3=v~muBF5Grp z0euR5wjR3mH4X0KL~93(^=Mu=+ymy-P;}2hqv+H(NpMWf;rRPB_u`Yzvi)@Zldabu^x^0W zbXdoru`pCmJJWXGWoMvB<0FOm+W_k{dMVCXfP`>I_wT(jV)xTztypvE!wj+oBAL7_ z6eVm}=lwwH#ab4V7;Ed7{W*w1giC?HjjNP1rf9knFJd3I<*0DLK8-B4TT)Gl^4|eV zUMt<#$6y_V3Ff|wH&*mPqGed(goOICcA_%Rha*?P+G5KoqiL8Q^NjBlSc%q#Z&I6EzO++kb(ZpzBmU z@l{{GX{Pvd;1&njYf%P(9M&N%bOKnizv3C$h5gyJy_?#Pm~z|nHxYKrrVlAwDdx2v zOfgys1ATb?F!fM#g#zoBG^ivK*or3XfHOK8q-zQx0c~%fibs^P|Oz1E`QZM_8Ps-n$m@ z{NA9hFu$Jvd{khJxblL&-5>wupN%qO!k z|NGsIg5b?pYP!wag22~)>-JkS(Et5)6=D&8IdE_n5WAvrwfEgBbAEi=f>Ik}(;S>1 z_>g4NkII%!0tpEYYlnwwYaq^YAw6yo_#}r~Hy>rY`?RAl)UuIh<;&!gWQ#vd8#l{b zo^Aevm=9tRbF+0f9A*p0R0v|7!F#J4OPd41mRbJhiaZ_%q+Qy&9J`W1m10grGSU>Ud+;VFC_dK@YM=n5%QMp$xs0N?S}TtXqNvj_Nip^OnFbM%Y7^k^ zO@`w-H%@;zQdX?Jk>@%aRn01|H)P?M(e6o7hxfoMGmu>NMo@BlTip5cqg7FJ0CX4; z&X?@P{}*Gz&Vpp!xIf!pNCb+qYrD7dm(euF-K0|*yq8iIeK8zZ)bl`{uVb=(AI3eM zEXeUm1m}R+xj39Qa8&zF*hN$Q-En_CZBG#NfsPd2snN#Ume*g~=&cSFHO1$03TCog zs}q+8Tz<`QctA|`Ckqx^6UFO>2#~7vC)-fg`2Ov_JHaO7lFJ3QVpw1p({iZvnDLz2 zs~hCIj*6b?@an$`DX#7DXjrbDi>qoZQGlLt#ay6DN!IeE$*n0JAm9ss=5hV zZ`_twMJy{3@peBURpjeE&?=QcSYsQy-)@9}G9{NYhJ?EuMLUy0s!%m@Ut>jmbFlk3 z;y6FqBKDiKDLCt{^pw0ALh!K>QCQH=;&BwJF-DqXN_~vRDDho~9RPstWK zM66qbB1&>vDM{6x5Y-$P;mVu13I_Ga%D>M?4`8_pctz*cyDuHaG=^5(8FL;mTwJhH zB_Q#ZpN^O3QbkVqiNgwWmtPK8C>k|jG#JCSC*_i+7#5Y|tqCD^Zrg6r)iE3MF;WD% zV8;b15h!kLp3J_C^AGQ8VT1H?mUIy6T*#NZM}OTN?!CNHp}%c0%^hEU{uH4)`{E_R z_4+D@toufF!ZuY)Y*Bi5D-#HBhZo8&i+P_T$9sf%(QZ-UI#J0bJ@_fZwW!TMS91FN z@@C+RONdqr^s?g2F?4nkClX9s-rjCK4i>rtTQ7<+XaVUFEF8MN2k; zJ>(#3X9I)Xww=uU3@4hYh+Vb%YUzA0LJ_v55BoO8|)8LvnEEl(u!yCU1Jw zu%zC3-TG|hVj$ZEA_$)@g~a~57J*~PCiV2Kr%()+0uISB8Gw@j(KA+cw*Q68{LEJ% z#1)17NTg5ptdf5}`)^dc)hG3q)Yl^On5VF-5fHV&@D^Z>|H>xC<^jye<=Y`PH#ARq z-&22CH0=8W8VfL$ztcX|zNG!`O#oiYRqtz0tpWg6IQ+_+0g|TQiKZBCuO(tN=b$$C z{rhc`6_Yl;YMcBya{m=m7p3ZsPuK=uhyiN8SH8qbhHnQS{LtlR*2@}_yLDb@;s8Jt z-w}ea#0U&n54FplfkQLg#+YEq74H)mHD^cQl%lV;$BZUa5r2)bs5ce~5?_9Nte?5R zv6}d3;Wbdc3B`n7%r^e6mQP$Ohz}Kl61ref)e_YPx`Ko4-(#fH_e(%^3EwpPb~)_! zxWOjLya^M(=Q+jHF9hr zmQo-)+OIDCZcyklz?cdXG@{kYZTm*FY;KX*n{NQD{3#>@OesJ&Ru=m$aXw*pIieye zu@)#aKToW0agxqd z8&i3xU-Oh13K&wt-@Tot_FC?Qr8qzI$zWTVO$f1MZ`@;a)9SB6Y^$IfXC00pX_ya{ zvtAQoHm9xRlYH);@^dIzgAXmk(m3mFDU?X&)gjmr;os4LL}`hs$F<{jV&D zV4>Qkts9fg8wGe_{MMMfyo602c(-N>*$Ss?aI~f|YLW_I>pjdtuL8!7&J+WQCRF%) z7h?$chj?a2`pML`lArL=U!9BVE52c!-=csh%A8uc9N%Fsbrq{=^d zlb)>cZi7zHeVjwztr;+Mf%`bO?meC*$BoV$?>6t)tqC}dL*1ftf>K|gSPxTkW>(s& zpUF+tzLx6nNRPrmEs&L_d!el1w$|6|5qv?_yvEeFS2`LwK$9v$ZMu!tR{FbjR5?Ki zOPe`ApCZ@mAtJjP(%_-g4j_}Vj~sWJDi!Pz11j>9T;QKLpd(?f_@}h1SI*}PrcpVj z3pW=PJ^R(M9%9lcFuvkJZ%c=(Q9-XL*stn9-^@iyr0EsTm`_7ZBeu-6QmL3E)zPvx zw8GeCuzQGfjpFnw_H^_%C%-EpccTbZb!iz`4u+ctdRM2lECSDD>=JyUkaCReH|*RE z&&2@Adu618ZSVT@uqcdzG}wlr11G85q_>6q69NIs5zLmKZ>-;%ThK1yDhfM2iQxq; zz<>NAtbSiA88rnZ__oh{y}XvNf7@a$0D!>W*Vwt1fN`I5O?fj+?~>y?ENyQT?)s55 z?5wZMpWLx5KP`g;pJhf>Ma`xfBVs9JULT!&$i?Yd96SZX8pXFvF9Z`dC%em%bj2Ze zb2&ABq%B9|+6}M8?t6+887Y|9`Q|w26d1R0O6w8Y8H!gAa%8ZZJ(f|3h+cJwX>U-f z_kv?9+dM4wMQ@O}jTSCl^K&Bu7Px z?D{{|?XAmNG#O4U)pkOANQDYc%!b{afp+%4BgdQmfxMBP4fnGsd3o7cMyy}(nJ4C6YHpNJK{M>uxI@QwH0Lwgo7{@W0Hc@hbZ{ z5Hcv~t-1Rl+`1xvrDXL--`+`7-4CgXP5JA`I|ZE3b;kmAv$vKrD8hGR-*CkaBKO6L z!%%fe@oLyFcJYs*GU7F`LTytw?^(3x+d9zCPhgbT_^I3>%3MJ&3K74s32(3VE#quY z_ihnM1%6Yz3yZV4^q?adoeF_EL=r^C)xXN^GhHS2=PaCE4yfWo%ZMXWyi@5{^EJ1T zMtN)Z*~)>Af}8JZ?kFzjJlp>3+(cRHud?bE|7w5tO5KbXRaDdza-AhNX z=pskub-HrcmlrzB37c;j;-}sS%IHMQBHL`&3^4BW87Wj(+_E@N5tAK*IXDh^hu9kecaMm(qXTbRgZ**jZcHs z1*U2Gx2T*jEwFkgt^3|0UG4L2r<0gQ&L%7rB1YevVL9y8WK}U5jC%u17bQHT8{4kM z3LEW-N}^}csCmkn!>+%kfAcEmUzOey>aKVAqj?>}Udx;DDgwZgqGkTbyUZWZFG_xA z&-=Ob@jVtkLC+c(&vuyIeT2_#DoUCj`aP~NOT=5)7*QnvH`nG<2c;{h+`s zAS4b`L7+HE=R6}UjCp0b)ok}RD(^|S?7Sl~0GK>d=jUOi>HqL8EAYM8vxl?Q^oNT| z9fX>nXYm7#5RdmFhaY(sxf%sjXQD&6*x2|S>u~`_K6`7uvc&QRz(Os);y(Th-qti= z#Wj<6y{jj4;#yN>H!2OtSFiPh!w^ea=&P`O7n7Ht{NflLFmDKXx>Wb`Bp-S8pK@In z<}y|4`;a2sMzOs@3ayN2m}LS9QhiTg$)fhIhty@eM<~YHYL3C)`Hyc-+$6Z5Z(I(g z|Dp}e2a`+&t_6%QunfG#wSuL&80sX2+0NcWIh=xqers2zanO_F>HWXdK+$)HD@qr$ z)*{!`zWiX1M{CDNiTZ`@1d)fE0HVN-=ZyQMjKgc{J1k$S#rpf}a2stSVF9V7j8u4x z5eUAlLcLTA`2JziUfotf`gH_Q}XA@JYxs@N*R+L+SLYJ{B{*#gJ0r`?IPe$+uR z9IMWFrv?7+fd#t9Pi-8@=uW<9NCigT`+MQMcK;B#OJ6E{UteI+qRp@hE#|rPd*d&! z14NNOOggZ12cfu((PWNuspzN5@n~sUI+pX-bq*X#>Yc&q5+*iD(s2^A?#>l{XHpN~+tA@t&ncNky^ zQuGz-BYF!(v{N5`6FD%vF^RET9K5?$9(ePo-ePEw0n8RpwXo z!;EYfvd>0~2q^E&{s_$uVGM-r#XDi^?mja<5q*XUzSwtSuQ^gV1)=i8&Tpz3Ff1$IpgxV~B1{?hQRX|K_l zN5REQ4fc$imLeW^I@ASTiP$9V8b&SD zqj34cAaN{6L9BJ{8q{y3ZPKTh3j}Z^Gq_cb{673Pp_7szkDzONc-Yu8Rb{pjt*fc3-=J@kq@XfCMo}irOt?xfb?dNj3Hnw z{phFElH-2@*g?HYomGv@cFx00+I=wS7ZK#A|S_#I(hjS;s7d1FckzGn- zaZU^#vX99?ZDOIJYk5O@_?I`LSLE%U1oP@$&5Kw5%j1zPel|uYo29o{10Zc7_gj;C z!UCR>UaH^1zicuZw<`a>EExU>*fa-vi&ulkrnK+g417MM0uUO%p)On?fCD~ZMP7Ok z{8n-KL%E9L*3K#|i68+=ISXiZvm(3C@Oad>=R-Y%Xe}KLZ|@paN+|50J}`Jax^?D> z*AHXj0Z?axG4b$UvUl(QasrxKxUiTlEm$7bZ!eo<7E<@+kGoFal0lizEZRk`A1Cvg z5R)Ox0{v~-RzNMg%4Ix8f)N*B`@(0805Pu%$y}~YdMtSaf<(I4gmP{X^O=B*t0?Bs z^5+Tz;?FVT-u*|Wr*kK-!_Y2n zBd9{=9zNBTH)3-sn)o?CSmS?9*@KXOPt^8@+72SuI?@~@$bx*nK!e(ET1yb5YAU}C zv;t^6pP>MKfCzVco2|k#5%FBHW=b_h0fz0L|D~U5chw8`rgY`UN3g<6{d$16G+Y~! z;^iNfXy-n4yDEHYiUrTutdd#RMx zTL0vyeaJG0xcWnUJPW9w5pXRP7-;=)SKcC~W@QE||{G$VaCrlxiE^+-tTq98KUoaEYsb79jNMzWT zGymLy%T|3LZI}V1zAnsxyP+BYBBz}HBq$~JU-4MmmF}`TTZ0mlT!7+hmg_FuLQV+k z!5@5w&Nr*<1Ym5Ln*S=CF8b3cMqT2lK-a`?O0?Mf1!gP{&_zi{3mrz~K>r9IGWB{R19Yi5b9WE$t# zUd`=!uRO@*L>70pw|jzhVJvv}t+Cw~3iop1w0L!BsO+JI=j({ZRNLF<*S{xfWUp zUfY1N0)V%X(WewLi^K6#H(lscuF`7Owc58RkJdIxVOqDuJ2qyAw~=%1It4W)aUCNJ zS)Z^mn48y;`#S3xHx3W`zT|G=h8;ij#^+aP^uw?Z05US-H|H~vUBT@Wn>&XFnpU~a zm*ZG2EV7SJ;qlVrSibY@alV5vMWcl-3*bmA7gj|fqNqhqwda~y$=+oTVGV^(@NS>a zwZ+8b)sQ5rrEX#(_d|;a zl%XO9nKf=ZU}9P8otZ9c$Z}n2Uy5->R}{*O>6R$ysD^om07v>(z^0i-n@!n!1E7nI z(V49Nia)vRClu5Z@-x1~OE64$zhAF8mtU&d3o#)K?-=*06EMxu>Bi(Fik-tr0G{Nq z)me7SAHt*LHzg(i?2uvcZzW#PpDlgKL>4r8!%laB{rtPvJ16U}RzHB9V$T4*sod5* ze-~BXSTDf6;XCWh^sHHrFvy~mp0`}G4}hdp-ho?!wz4yUlpX7G!VM}HfnBp$q2lAGl^RM_qBxjI8vODvQjgt(U z;70;(H9$08#X`d>48wdW=sGvamGRraMid8_;^B9g$^(~y=$j;Gqlo+43??kG0VF7L zK(}yHE`VWDit`GN8N@`)TZ_C;I@H8PwL6RVn3dKT0&JZX8|9SdEw6toPom4W!7a!l*IoIhYYDHN&lnojL!Z584w(RGriict-(#DdBc~-l)Jp4UEY3_< zG4o2ebTgNlU6S)>q0S*o+KUGdHT~5s;Eujp8L)PL%cFR!*YHOuCZjvUI5kWM&L^o6zT=)OFdrAP?1erOcWdl=)F04yJQk_JEd3?uOO)_ngZX17y-xsFL7E zbDp4quo0_YJ{Y>5(n6CP{H6-ir8rr@B;T}7vJBLK_!6|fo+8ynO;YC3n|=?iTF)z^ zEa&_^<;LhWrj6!q+v4A|P;$Z-N^Y#Jui5>k(^6je|K7Gr<3JQi6RV8}UUdUrwN%`$ zKOiqlk=6tt{=~V{Z2*scJg0WJ{(fJrX!nPOleB{|voWon$%`jqxv^%Qo!2-Cw7he@ z`pwgJYe%zO!Od*>r}$hr^KLxQcs@F|-ha=0+&FlFV%JDJaRnXgGN**Bd#lFS^gzz@bt?-DW6eHWci zDLH)2#j0nFd`NojjUv`WQ&YD_axKiyvYg;PyFqV;WWbN2W-UGA7JO%W;*`N{erSl{ zqFb9yrymZE$e41Anau{Hj<|8&H0GoB3I)&^&nNt`|pxXl2p_5n2NbCtu^ z0jJ6|dv~MYG}V}@?Q>+oC(vAGy)a*^%um0ml>`KJCXer6ZwN}#;*R-=&5CUYo_7E^ zc=yxC98|Uc{b}~(`_Wbqxspbe9djzTah+Y#nz0Wj5ZW$UV<3r&=*7wku4U#>*R2K*r7fy zjUPj*I}hwDmO`=*IpTTz1MGe8QNh{wmXl^cc@yy$BZ_1jFDdhraABT-H~O^tIwsl@ z!o<5?4E#qOhI7wif>Y)AhFz!Mwr0u}A=)!lsyVld=fBh|(Y@>j z6$P?9?qu@6CzBpe`rE-`DdCB7qG}s&NZQ{D?HIO)=AevKF&Pdu64sq!Q&EWPZx;&G z2TwsQJh_vN%zTf@+G_Cj;Vz@wYnuB)O=YKY%n;5=4(FB_qNs2jPAtSeEfe6L?L+y< z0jZ<_32qKZ1bhkCq!(3dx})T>;bIgj|FP6kF^aOqn9_Vrh*~Lpy;8KgriOD%*a}f4 zn(o}=6sPCL+0mypw~(?sK}uB3%C(bH1w-4TA~Bc0d>3TvU#Y$s3BvWp}l-gO<-90 z6Sp_Mn)&_XYKylvu+s~r{wH_^aBnS01|3b~z6<_02mT$CPE5>ei8-@=2QTLJ-x=@k zf#RObG)9X9Iy<^AI%ZL1Fw^!%+epx=Nl4lu zT~J}pxeE@A=|Xey^!lwBH>&x&jFx29l^MqOIz4V6G?z>#=`LwCy^sVA7y_FLrud0| zYB%PVj4`b-N2SQkg3_vA;*_mO2j5H38DH!(*3iEABD zm&OlX$WTva0O_pdz?AF^tSwXoD%L@IrR83wti6KUm;auzexk7oH{8)GZt9Y~>9La$ zg$X|Q&FTDLA0phCt3j!A{Rtw_h6r5md0WO4&QM77k$abV`<(Tq6PA6SURF>Z_+^v( zLMpxSmZsLP-;0ImM0AI+ZsVF97T4|LW_91oCoRCU%kGr4z3jS)e;K#7(aN)YiKj3I zNQ|VDf9?u985L4&ZT}Jns4)Ag1HF5XeQ2lrCLcxNQ7m;L%<-k2I6jDhY5;(P&i1Bi z!b@5;K5*Ce9{V%O6{)!6ou#gItE3;`!B*V-KXWMM<^XTeTJ~&#IiS_M!cch)3F1%H z$4$!*8}6{4&UUUHG{sG|VTx*7)+(5;vyPQu$?mQK^DuFJfU5|}-o*vwc{pYYMoR~z z^?DCCkN4L#T?fSdkO`D0@fy(esa&)6a?^#%aZKJ%%RZ4Zo2MR8Kp*PD$=j(f%%vbQ zsRdFtB(@(iOd)>ind}=D>tT1CmA{%;2ZjBB+P|Uk&U!>cUAb2a0--)4zvw)hk%Nt# z+q8tZQK$XyeL^CfiyND;zWBB8-S_gQjhQD(Vq*BHSSDWOO)T7^%u}Znt-D^IE|L>C z1eR3JsHd>}<0&M_vEFhBBynqczcJS>Lc^N%LR_SSlR+jXYJk|9gf%!bEG^9|T{@Zd z(U|rA2#W6D-(Kvy!A`)Egms z|IEW3Zz)Uxb0eby?mXr^r8)FzY=;LxGU9%>3JnjGK6$d`O8f)lWdkkGt1>>Uq!w)NS~d>?WW{VMgY>vtDeICOa}lhfB*rS zfs<=spKO1vy@m-8lmnexd^g(`6SYe%v6f-{as+HmNkr>OdcTx|B2&vdohd?EqAt37 z(fA;y>FlkY;TzLDi9kx^)<|$U1KbqgW;ui+>Cs;5BC%;$IuO8`WIvx3FMed|> za=g|aq41Fuh%Bfz^wWIYi6W%Fq@4)tMvClco!|5=VnB?b23FSompd;mUI!X|&mzhr z%|pz)D0f&8My=-3O$Yh`x(R<_XiJ4|iwJ|S@z$EM+{Cn(%ZTbSshD(y?wLGp^Mq6a zy?I2l-0kzv57Tt8$f3X7y9Ss7&ExdUFo!1 zjrYpPkAf;v;OD~9Nq*v{M%WTl>8}}8c6}ba0RVLr^%-7$!A3QS@+Z9d0Y&f;&6$db z|HMGz25;K6XX!D}(jHDC+`B^xGBnDfnP!Ec8RVPNwWTLq4fVf0nk&!f=>`uVu zG|B8vbtiOYjrkdUGWC)~O)&gC>ZSVocZ=aVrC3tB0?8RU?N&K$)HpFjy8(}-Q#UKt z%#S)%*P)(sVv*i(ZQfZk>h#Ultg?+7Q zVt*c`g?PHnLB5I%?kkK169*s-01wl%5YTvv?iTq$2e|RKJg)R&5|X?=!yR`pjCQym z%=QC#p27Lh!9ae?7p}ZdG8{)Fz!Qn6a$(T>UrTK?eyNpby1+1>0@4>k4}LPhAJE`l z@X>~iiE^>VVUXTK{qu&vb(;UCU+iN`O#u#U7W2b9{2OrP@^9{SB3yOwZ)GN?Q_FAq zJnUBBcCb%1XKZr`2cg1)WWl$qv%tMmn`c^*;bQZ!V&(~~r?=E>mVh3APhjDq`EcGc zXg?v_cAsFE^Xa3s^jhiP2=RWyJp zoP6t+132?q1I)v3M1bO`sTF_2=wLt4Y`CTdG80E)IspFR2--OimQ+cm)#_J1-9d6u z`IC!L)^P;uh4)}tPdlO61wu1)b zK{A>_GfzW2HiiIhs{oK$UbGgWrc-s_kb9RI2zx!t8xm5y7*eag*6+VQU^xl2(oAXt z=T05acq9hW)20T^nQV2QBi`CK7XU0=ViksiS&I`$+Y`%e-gn>bvj=%76a{5`*WLg< z095A%Nag4?~P-|)d@UPjS(7EQEwd%<6{j)$a7Je?&yIJqUcKdU#=)lwq4~&2i^5u<^%j{$Y zSGRX_Uysoco^BfkKR{;y>qsDpvkx}Ngrcp-$3U`awLnXgT~Te(f$yiHr8B!&ahR9f z!cR(cVVJOO&c4v|AB?c0wU#cpSv9q z&zDb9T;T_ns8XH*KlS`9YzqJo_&RKH`X)Yyg`8%11LZj=+P|4Mizy5{CqbiaC6JG`cGhgRk zT-Lel4+XA{HoCOAfHMw(oL9bYuS%_~zmjpLwu_+m7XmkgGW8yh9d_9savPi(Z9 zt~?&9wT~a|D9V0QskgkYrU~7Wb*4@8qV5zz${l2TN0cjL#F!THNtj4!F{X&JH}4tD z#%!@K?8q%)&_^9t*`1KNqqWgdq_1nC|OtjOYrRBrYx-{kwO1!3Zo- zz*WCUX(pOI=qcSLsY>xb-Wg>F01tj5p{^v<^j001ceqRryeVRX0e6{z0Y9;e6XSiG z;;mIGFk696zXSYxsUoMVTMn6m`MP6S(0kgERPp9<{%E51a>J+V*8J)QxaE(ICxuCE zT4B*-Gf`!CZH0Z@Bwl`b;`YqmY!to$Xm&^cD!H@Z4TbA~!Ev^3W||1jlXt1Y+cRNZ zN)4GhzUeFEm!-9f#LipX28Wzr>=L)|wMIZS5OZvO4)Y2Jj8khm71P?6aB9_M7*HC~ zf;cah)*$&#CO@c5d&J$vi1I^z&0%)1@cNPlbT2hX^ZTg;O2)D()9fSPXxo#voh|gm z|MUYRfkpy#)#^jS^?6M>&JPc}fP1TjoOG;CG6*5Jx+9#rbq+;<6u0pf=qC>9P&uf@ zf`UmQ(9{}_=;Sl^KWI7Sq+x^2rSZ-rKW~n0@%mE=0AKHR?7UwXE8oMy`iqh zfKUz{^8Zfro{z>E9;xv*`|F1v83vf<5)x{x(w!5t*Y1aY1u+AHPSt4pRHpc2KBbJG zqlCm|EEfR-IUANW@iDWq6mx$}4Mhp$L{Bzy60!6W9P$aMXZI_sA}zOnPdX5w!T z;zB0aN2*R+l8KR=+yOk}(Y(O&All%AxF)wF^JrMjtnKFx+&r{q7}*qo_mR5r6#M#p zSbgL^$B*nu=*oKVT?4#=f3@-M-lUws?R{w(kM!Ad_O$S*5X%iVaQD8(-AU(}NbGbi z#SA*nA+~Z%c75xGDbncKW`l~VqA#Uhd;Z(ZsttE3%6v8yzq=F`6tzFo4(woh!hF^l z%`4cpo_oXQpV<>IoIsos4f8Qm0)gGezDz?GATDGo*Fg?oI-jzR&Yn3?;QRA-6U(ZX z=~ohM%F!G1yN5H>5sUG8#|_;}R{4MMGwT^rIh8tBadtl#n|rQS)K8t8roIx-mptd% z7?k)rBt-8=+^FB`qz?meaM$iz;#F%Wz{5o(Es_M%%RKH$*w-VJjD;J4fzp10x*`kZ z7x$Ix!t7ZGxdBeBR`Ged7sC8@v`v7=`#5Lm@J!HqsfC-sGX-M_;G(RHmA05xl&$Px zs}W(_flho{<5eS#BCQRU4JT`3HR;C zMkswP{F27CjA-(Of@5f8BD(I3S>XtBRI1J}zdH~*7)gC2kJW0Uc%f59DB)2_&9nxV z=jU<;{t2sE65akqJKy6SWh7VP<9Kd@H<)COA{Q{^_Agt_EKr|(@q3Hp_Qjcqcb^i{ zq%RiI$m&S5G<63Vh6rZl9WkEau@AH<>s?$7=w1q$i&K8T!nr` z!$=0lst!%gPw#s-dk`I3iUn&~`9*tF9LwycF{RMfPpafqOM0nW)S^y`@yt57H?Jaq z&k0usLupJH)3;8Lw8PP`Bb!brYr-bSk}PVPQA%uju&y^;@+mX_1ue%e@B_XP!B0ub ze&`1ETHLo*1oPiCxMo_}W|?f=6UV)1`gEGq^Upf2qvbt{iV9wE!;i9lm`vqd&fj=n&P0 zb^qFXyu2#&;DNACMRB;9Z3A~YSZOmrd0<#_;pdor*`*;1$$;|0ZRPWUbNvZLdejxYCj>7xkbt}8|cT*x=H4gRt-2Y z`)sCJ&s!z7&c-3r?r@(2ZTlb*h;Ne0iHt2AHp|AA;Dk|E#^y_WavbAIn5;H}I9_is zmCkGL%N?w$qYFJp5xfYm*p=jbvSpSCZm=4v1tuL&1IC{BcN=#A=2(S*6fX$79m;Jv+@_ypTL-@!qXf4#3l7AN8IcSo4mO zSX&yAEbhPmvJD+Yu2l8c3ur47A`Qo-ps(RNbD);zEWjl09piOLC+?Udm2;b9n*iB6 zNUU@SRn`fO9Dhd}iw;H^Tdjl!bm0(zvXt&XJu3e<|I9gBxFY#r?+Bt{SkGOX_QenF z9)zqF^t7l5DPrI%(`x=zOphnzv1So__m4@YOo8o-E5{OLoF?~eZL9#US!~5X{Cwcx z4AEn3uJVMfqq~=t@d?mG%}xE$eIumR z%49^c@nHQtfF z9TH+-bcfUUxays!?0P>hUZj$D5!)_SoJ*&rQz>-6wC#eifHJ2tPr2gSEqVH00+VdBjoy%B*xG56S0Df&zrCR=g&_BwGR)# zPK7V_et#~Q9$LQw^YZ3BAde*XC!kgmL${WYou9T|9JJ^Nu|4*x% zpY?y+j%)ac-m1t}kBH~l))#iVu3qR0USN!Be0y0qPC(t`Z>d4X?)-Tq_wnMbf7E&S zoeInTPdBDE+3(`61pjOmGQFW)%?_S3rf2+~ozHDo_)bObQuL-qT(v`nih*4Og&`oY zxLo1zSf0kDZ{t+52zbJfLE#k*uO~@l$^ZE&%;n!`kuq{q-QaFEQ9bGZye51_!|fxN znQ3eGm+V_->8`OIIQ+6OySm}*|0fY$f2Yq-w4|fzZ1=D?@PF;- z|CbH_|NGB+Y-xV`S?gah3BO?R^Uv`|J*0Fzzv?^^&RqTyoSIT~k$YiPBU^mHEe{o?d<4le%jpm0*- z=8%MX|BAD;Qw81w*HIHlNZ26@8=kN)#6snFj;v3c0)1)|N)9(Cs0X3SB)7IM%{ZL8Q2gO10EE<`37X#zj zce7sE*@fuof-@gw?%ex)kEv6F78SE|yr~9Jo`czH%;pF}eMoeMyPhXIHICF3$D|r6 zbt8LA?l_KfU?0N-cXqZ&3R{U|I}3?$qati8&UQ8$ zWpeSd`!%eN7HQM=W;iafkPV7*hK)ZR;^kHhKD<)ffJ&($)LPHfpI^~bemrDfsG}qp zLC_t?S`x@bD~aS0>NRf^){(Wvr}O! zBgnJ8{|QX6y(2%U<+g-cQ=%*-g|>4WTN(`?$6Ec2p;Ny!wC5LhNlsUG8(MF!vQ581>|6JKvbA2t@lS77Gq;KGd51%T>Lm8;J=9FcRn`ZY2pkb< z@TeRP1Z76guDaxlf9^=8?kOJK6_J_~QsyHCDLlHNF_BQh2R-frs(t`Uf02HHI}W8$ z?nj+>-ea=Z$KzF3OfL~JV}?P4l~~u(s16S9KkF>}AYR2H)=iS9fER6_c|O;Fzgt~@ zOQr>@9jeS};B7F=PA z<vTKI=^fRT>2klu)}!vOEX1@5=?Uq2 zfeFPDF(oO_0AwKYkU$(|vkGkC-=n+5*W1Wl7Hg<8X=YhYn< zg_dgF4nLkYrT?yyt7x}%?&Xj;i+E*cXUMWPz>p1k{JhwR>jx8^W}E%@Kr-u*#uB`q zO$gf|-CHv5yOwmNmM_)#uVZ&9@=h?sVqRD1VB|O&e-2&yw~d|DCx%$M+?9l6g41eB zN-_K^=uVv1#9TMo-+4GK*oJCLHP6>6Kt)E-Zx1D`=ysVY!MBupbQN{?H|YOo`v($X zwGZSZQ%-EAG+nIWQ{YsYR6NJwzS4Cey`^}954ArvwccN^*tQLKIpeGC^dmMMKeu{{ za7IW~BgSfH;U3bnt~fSzcAQ>$L*s{$+FGb+y}`Ii8S!TTH#f{HhojN_%4nu=wPR%i zPU4GehW#vy*sfLv$+>^~+E|Th@*vgD>!-Vm7NwOyonLfnfnUKF^Fe(>aZ8+;GWJC# zu2Zh#hAjtyQjc2@=tzua5ox@yW;cdlY4<*wA%%f(W&7ErciHM2jj5F#G?itGl|52J zX2XGB#;&j}HMP)|UaY0DC+9CC4kwOnpfSWxbZ?7UBUI+!Qb*W*C>@(Uo;J4w z%MZPLj?YKyvW6vm@(Ii1T<*S*t|*8&xy^bQ=!~TMYAUpS9As|Y(^jiE=4d!v(1ThI zl=GQ;$<_3d-@V-5b(%fg(c^h!iA|&oo5YtrCUIk;h>rz=oT!?iS}KvXZ#5CtN~3O6 z5hY>_m#>H!%vKXQ@@#Bt?rB4@=DxZbk$p9J@;q-M)h^aZ*k~1N#xtGaXK6jQJ5`)Y zdDM4ID`ZOY;iz#Y+9&k{RfhMZMA-;mnqPo!ov%O4C-lk54=UVJ0d3P?Ud~f`eAZnT z;$p6>r12H1mN}%lo^lQO!TTAcyeQPpgvC&7Y>$YmFz(?rxO)5SteA^a&%1FaA{FtjeyIaGmm1Sca-_b;Ge~ z!^i&pAa&%PCs_e?OQ|JWsL{Y{`$a{Z#%tUK=k1+#WizPl{k~%#7e^L5M=fW)Jl}Fo zt(_oZhA#7duI6v_XnhTKk8qYp?v9)rhLb7jB$%iaW;A)XtyxmBLgZn=TZg6xD@7Qy z~9+I=pwry4G7O z-i*$p4b;0Ih3?WfU$l^ev!5h|Oi(;cD%J#dsqgov1Inty@`z(R_Qi@9WqeXk2}xM| z&;-uxvnsFfMvUl)3FYmNnSbgnr}1t3=nb8K8`_S}YC4wP*d}9)YTw|Epu7)L_P$#e zOg=ycT11B3!rI!(Ja_xZthL+W#)@bM*@E6KXSa!8rIHX~&4`ZesR_ktcf1HY`7l6o zE9R!hb*BgYz2jsr&%Y+Sbl}ShE^X7xicygC-bL|L&GFp|?!iFMzEA5jGcn7XdKmn% zkO(QS6?>o1#RGYsACGeTG6-^u@8fXBXJZAW&Imj zN{P5;xo?P;BUkM)OM9gCr5u&v0*R?ra$_Rj@sQpCZ%g+s0WA*J?v>MqL%f}8=3MG* zmxq2(O&Nm;1P7e1L3v?vOBw&BAg&zD=Qa&9$c;=(~gp<)$}QZiUi-$r}2hK9ip zjgq%+rzjIMM|a-!gNeVeg7veZ%D*Vn(*z)2X?1~{k75$k)ITgw4UQ#*T(3yO*r zuq`G>@se=yx6E^1f^6~TEYXG}vA5YL&&o{?izG043fZw%MzV5@TI-t(>QWzQT)()h-iX6fLg z@8qPcq7_54PkOJ7MJG=;mequ{9c^FpXM!Xm8_{V5tkSlF`^wqm?bPmVCPx`oLRl9q zD&f?BO?3IR4p=a@Od&~qFaOo@F-(Iu*UGv=y~K$u>6fl3NMBq{wuGB}7L{^~hCc3l z+prCk>I+h&mV-IOJUjW3l8U>@R()O!w$(S6sYi~(o%_W0&tf$9y>A&FE_-)k1qYNT zcWZ!y)_gp~JeQDmu+X(K?OxQ-c5O=Mj8xSv7qkFdtpCYqs7z+|BCc!68ei^ht2<-U`*0%1Iw6HY#%l;}$gcxwt zZiTMtx^%7j`0vgP21e7uxpJxbnn0VSc-xB+i9j6A$m?|AjZ z>#GOXlqxqcZJvC4m@m05_YY2;x|%D|Vfkgp@smKnUr+>8X31F_C$eiejr$LJkthnlsbO96uPF`p}mlhPDyY;ELGNE)f;K)Fu zKOL1TCv{-jn_bWx>`5DqJ^WyC?%c8a=h`2ZVf>e@h9iddjM?vXz>?8nd|K|EZkLaw zALLy4;2&xFPxj*X&)w^lIfp40Cm2m;!>7iSZhvPNN>ALf-6J>2}k{9@5$aSwsB$r7%wBlkyTu z&A(cN4yi&w8jpEf%n#hB`-9x)%PJu6&Bjr88zsqk0e+3VdT8>&svqA+zwIWB1Reh4 zaO33btM7WlR|}cbmFT+?VGI`p+%P}3A^Dtf$xW@m2L!4K z43e`j^efm3E3t<%Gm#7a+_-dP(}q&>YQ6bVK-@|7l5kuJ1@ESrWbeM?jf|BzB>^n8;2MzH?=4= zb-Xg{X7Pi(sOVu}_xOU0)xH*w(7W=tZWTwL{rcp-#>(0?!RxPcb}j%iP!T@oEf5!L z&Kj*a3&x!9Jn;Pu_0RNc6B0-hP~H7}flpUJDilkT6gLqS{ZW2L_#e%9%}{~Yk-jTUv6C!xeetO?;BdIfxTV zQv9g*y}nbZ@|Z@(qx_WY`~eTmq~em^x44|QPNY}uX0QhTc;SRoOGF_6l=L2Xwjtx4 zddgSZ?IePkz?g9+!@dxgcQum!GZ+y!FEzZhH86n-g6J0&f3Y1eDp(dQCE~f@MK@`I zH~1g8*nRx9SZ5hgQOjXYOzRj&ZuVbz4E0&U<8ly(L#iu6C;8tW4=LAg&Hm=pkL};# zg;Xz;E6}lm(Y5Dd1v88F`m8?&(r(~mqf7&vO#6PB)xV4t3=l~zz3T+CYj05{2uVG* z6&7;ps}X={#8e@I#@NLKobC*k|2}q}Ii%bL>T_*kM?-VOk7fb(y2MG@>zdN-Jju`L z1LhOZMoCv?Bt5AcU`2M}7uYm4zPT;m)>k)_w(kGU_C(H$e~l1oJR zrT1}ynp`C@x<8i%xt#I1XX;7uLhs}tQD}zaLI;=nQK35dV|qnt@Cmln0t!K9QHDei z!|tP(dBJ|od?B2TsEHI%&542a*_`Zn(%OQ!ohza&9Ooa9%DU8I+V>oB)9gJl$-&O> zNz%IqN1p91%$-C396PU**0LX_3MnjGqU9vDTzea<5M9XyQC2iB`)JKSe2(#ZZ)W-W-O;bKP=hqE?^vFr2z5F0`{@8sZIfzzDDK>Jt^p@E4dch1I`7b>l4I{7i#c<;W z_WG&VJP|E^^~ARTWIU1C3MNuA;isfjyS{`mJFcfF4sX1Ks;( z{gOd7Vi>EwZT`hbJHEvJORG9J6m6qHC}Y2pu*;ik@V`qFwjKUJozD0?-Zr?zA1rb< zq{Eq^^ws%_nlG`6wyq`^udE2Vz3*Eg&Q-z~4=cb#@1J8o3yG)h<}tSwp9u%9LUn1g z?`^IBqJww=l?JAGji?#Ddb+*$b9kmABFKHH8+qO7`ia;1FCh6T|A@%8?w7f<@HCUC z!}gH)EX4`2|10EjFv(m^tP-H_(AI0Vmg+j9H)4?d_W^EuOn(}pXXY}d8wSTV$`YCM z2ySP>V{m#U-)0*p^bTNXXeE%JAn?X z$%a?vCaDAbnC;E5X}Z6CDfHqTLLt`uNWPjz(rRFi0I~22fNb)wTG_rL%ll1h(1w0- zl*%0OUdCyI=Z?rG9MfRDC1ULRpkTVyEvG&{sBknuFNNQM?i&6Qx9B?12>Mi{eb2H% zr|%df8Vw%r+LwS)URIyX*Bo}AIOWTTNo+~d9QoL?QkgT1=d#14#M2DG;r})I*!o<< zLk9G+!x3VB+isrL#i;Fb;(Mn~SI(cLSO=jE^w&0j%Ws z?2Y@J;icgLxz%}-uSy=Ub z+ufOe!$;TFs`j0<(4p={7GR;(BmjtHRL{F&kEio4h#XxF2!dfZy`|%%7EQ01dwtAo z_bv!km$$>Ub-Dy6Mh9fGq<(x!2v!=UiQytSemj>mRf{9l!}BVr3VpUpB`cX6fE7nM*fmOot}e85S@QhQQ3FPFs>l)U8h%KH3JmvpmMLUL>#UeYU1 z!+R)U)SO`}qk}yAqMPnzAA1MR4^q$xH9?Bb!MnnmNXn{C`RlgW%r_0e4{{!RXZfjANO&bk?BUwAOvPlYCDHXr8 zrAh~=g#5r}0d0fTmP@vWLy&>6;bGp>YXG(ZQZf{F@^{+F2wc+i)h6<+7R+a>cApgARK&h_ewaBr8W1j63iu=u%19!ydZPFgjz$nD6n_4yRxC9}Sn z`LDyADV{Wv9Q@|4?JR<@L@tC&#&o;gM&sC* z_GovaJGYqmjEpkO^s|v4&o;}A=zn(m*U0_-Dk5bs3)edHS&4bORJ*-Qf@9+d)6co~ zT9+yU8fx{^X`D~?V8T_)XDU+xh3RUpM$DJqmeE;~P%&|7`=}`Eqm;XQ%67A)DfJD8 zmAf`If$TVe<%zFVaBd@Dwu+j{J-2LQ@YX@N&Em-c3*5eA;DJ&gJ=1n5j4v{uFBoM& zZZhy5z>L+_S9-vL3rXX*WlA65XDH5?asX^0+(`8l0Kd1C5QCtX^J?}3cNHjp-{x-> zF41qQZXOx4vHZZLZB5 zx$-t4R}D!+H7lB8H;kcatkCd+^7tff1U>^x!uQc+q|=b7ZQT$`X<~>o7DV*@Jz>#Eh8G(T>&>U6n8v8qC|;*%2Q=r)IU*p2wKH#}o~aN^O0x z1@#wO2nn(WdnB0|yw3Ynm-p3Y(tVn$cN|T>EIt9I$h<=%$$sU`wvgMgYoDZ|=g(aI zSr?qEZf6jAszsvu`@7Bs-xccKjDUFA)_XAvBU$z#HRn6O7EJ?JQBf)p>jU9~{j{08 z1wNfQ{?2d~#ppIn0&CU*Nq!J%;Js%-qe>kF8b%t%qxo2aOJ#fvyC?Dkol6JG+&lA? zx!>SOgda2ya$dLU=74>nWpzf7idKf-`}zCx|Kewsa^~*xsuc!0TisAuB@B!BSQRJ~ z{5}eJGm=6n^H7C z{+AxN0$n^Tk7KzT9BfT__5S_Ju{N|lYKOQ0Y7m zkgC9Mdhz;*gI;%#Dtq29P27Go5U)QCjAry!2z^E8Bd5JwqKS;?5sf-BO=$pLFD|08>Gs06k%G`yH7 zhP6RuShtMNT(?Th<`AZ+?7KzsXUQPSvs5)Q%D>I1W|X)8U0py7!W25p|9u%vbU^If zDbNkpDezdRE6b8Gux00=2GVQNMP!6L4!7iT@-0P*JU3=t$75hb8Fc1dG60}2Z(FWT zTvUL@Z|=9FOK`TH?3E1%fvy;+&54~;d+75JbpzeTp7JE~E28V7h#V`1 zG|J_b$WG48;isF->03=Txk94EDGab=#sEM$D`7HC9|Xavl_}-0wZ8KxLkdv3T$SmU z&=mN(&C3=qvVQZXABQ;^<4s>-u z&UK=I`mPgCU=5z&WlWYLy2dTDE1Z{7x30zLia=nAyj7LPY*yf%{6;!pX z1QiHz#xp{s+DMVZVHXI0WzGI`haGFLSrxQdR5kIEBX?ScKEhn`Qo+ z6B};c^W>0s)0~aa80EFPIkuZn%{m8zI7eU?wz>f}+!xQy2pApPV@TF>yJf-M1s52- zeK#AgzDg{#G|wM_M@DbO(>dYkyo)18sF@B2?II~%!X&(jvMzO9YpaBv6* zlAwV->;Q`G0N<|%U8-J1nmN@9Xs_&J!f$b-lH3Qy=`3ZerFSzf(Q0GO2F8p9v&!3p zC-P;tI9dk$ZocCAv7bL zQr_o6juct_4qnJ)Kro&xLUWOKjzpm^Eu9UGS47Xl;^VZEWOz+u14T|jo_S4;>`|Ai z+3&41`0v}-QR6?osQhaA_J|RYk%eezUQ8a+&VJr^BbdIC@x_hU8pr~Zwsw!M2!N!4rhIImR4u7k>99t;F*q8qK+uq?x0?6@A^Mh&K= zg#1U4YV*sdn;pV_mvr1pl8QJ`D6EZNkkpyD!UWOicgay{%O2LTtY+4O#-!F?K`8~O zF{Tx`Ry|Z0h%x_>{bS+i&jxD$z!|jN8eup=DvfWZ@iauL7FO#P>Y2b?G5n}mhFmk_ zU-B!L_1^yOKN~eK?AOgfA5Q^(b!j!N0eIQP6>)-DYh1kvl4RJ5x68{z%R9&Pqmf?I zva$4&nFbld51IwZ)gRWZnaD(H|Rd0kHPewB|w4HM@ zuPs=dnBZ;;{44X{tpPmNATZo{YWG1ZV>P?Vii7kX`H+@IACi5Y=Sxkj zG0zR{{DA&p-r}*^hesio4Z(f39w)B|RADfiPzt>hZ1O+vc&dOYB9_3SAzVC%${~zo znXm5T?w}0u=m{eNbK6prtcr4?yD>9Ri8Qy9Ae;r7#i6DPKg-CHfB<>6rU%8ttmn78 zw>uY=1#9Ss^VtXc$T1|c;ibxmKA<6F+JQ^S^hA!!&Qov3B1+b{PL#cXnL@tG zJ+Va02(#%aH{9wpWbv7Y4L$_&s--XNtOFI;;ebGF+2H@Z0TMl}KQGfVo&JFAm52JP zFM#F=9XPX@d=4S+qCv_$a+MrZP;w2-g1fA_XD2!Z5+t$PR-(ryHXA5IF>!Yu>D{m|ov>$%7a0F1dlsN;L4u=P>mrciY z@9Y#=Q+I!)q>fHfosWRrPiqlo<1Ii=!HFeLevssu2Cy%Cn#CUahw5>Fzhs5S=0Qub zLMe56`-*tuhvWZLPS=O7>^$9METf6qUjD_Ag>UHi<@*7LbL*7?hy3;L0A%i%i*%+0 zvk=7T2|eDK(!rswyuoJm(7-18Bdl={BPCN5eyFbv>yHCIfr(nT*I6Mg0L?2g=IgQ- zIC^;M=$kGoe!BmSNn356>lu?$;?Hd(fcIX0Ek2F?Pk+l$wdB%YuU`So=`-oa_Tim9 zkIm*C5jzsBsajSG9&npjc!n_&o?v+rAkJxEB(>e1%BlCU=C>K+1SlO&AD(e(NFo7z zv1{`4q+8P`phwmVodj`8(B*rReUq66EXQA8Ju%aXTzzvG*J2|hK6z$m)YqBR_*n^L z{h~0ehewO5TQndy30qk%6^g1k947&i^erKyh;eJqm!(86GOR^mDxO+0cE9g!*c||P zt)HyrVJ7!2i?!&8pF5Fx$>#U2T4gXZz|41?F{thFV;Mbs2@Ie<04tTLtVRe|vtRjM z>&yaHkE;M=m7%aP+K?lJzwOM`%TQD!88+RsxFvf2Z_fnXuzE2Gl((qezcb~_bsg%$ z5wtp69UsveE(j5A9x=xKir}lHlV%*jxc+Ay{5}Ej0wFU7kxZGC2PZ>yxvJK;O>}HNWz$F=$vLsP1{nu~VJ$DSMf4Qx z5leYxS)@;IN413?jmtb0aNf0CS$hAssUohMP>KXtd%S+*SWWpTyJ)hBX68Fw%;R1_ zQK+-+`}D%`UjuBO4>-vg#p8FGw&(^?1k{TAu)OoE#!tDp$zO?8jsn&<;2#NbwP5v#IK7j`k4#i^Lm#_&09ox z_gsK8H_%;;LvU$i$<|*wrsw`=hzIJgVox-l%2dT#j`o(@sDH>D@z8wo7+`PYsM3EO zmBwm{C~pk)4X#Su6Ck+yn zT%dZS*EFLYYiVh4AxlKM=6h{zLc1vCrkBN!XvkxjTt%uvSD_;VDQaJQsB{!B>|MOJed7LH0lL;e*w8PbC`?`M}!BhI~)I zWq`Yl=!1R9x0`?md`8XJ+HVC!4J`MRpNO40@%kpur;VNGXve*L*@UvG6M%+rLbs(_ zae1YL(0B!$Mo)bd>w$&@&ctjcK;%4@Nsc0ld6=@KwJrP_uFuX)f1JnSGuDa?V2!WyRA&ds z$(w`ZGOc@{WV%{fdHQ=n=gtS*17KitlJ76@-3=K_0Gkg?@#4+r>mAX{VWw;)blNkd zi=4i{>s0CbLP{#*SZ5qs*aoW!f?8i z1Wqrwj46O|$8eGFd}8G1VHqInI^sdI@R1BZw7^Oz(dM?+|BYH1T^p-CM0#Q)!@)Ld zAAS!YNNvs9q@Vw@X`nNMAF=I<7{0F6XTFQ%=oi)t{&E3}=5pQ?=Pk3Wm?;)(2Jx@d z_9`RPZsu3>t)p)S03Oq4#a3DP=mkcYLF)o!mVkJf6~%Z8%jLEN*MEiRXq2Ye=*~^4TKEHI`%}E-y!#SMUkrRX(7{=KwtN*YSD(q)YZGi z*-l+)aSUSR4K)F<$r;r=O5CW;sVPRceGecIy(BA%NK2=rcLb?d*(bH{1v|-0BBgU#%-;7LmQ%(Hn24Nh^P!wG>%LSM}JDXul-`=XA*!NhFeq1s@{TR10z{{f#V27kJn0~=na_PL)o{cB~j2FYN6f4ega2%L_f00&%T#St(RL-6VeKAxU*U zW2?hb%K3_|dXkav4U)vh9vx&a{33SG3u!B$DO&dsZbiy!m(|ES*%U_$5@jtYn~-I* zEH4u~97Z8?^8<%Bx1zX2LhFEbj}aJNG(R@-+D3}yi`=!o2SQf2+wBBj<4W5LcP}ko zmsZ(!zM*X%vfEy>%liY4Gp_AHN((s`O{o6sIM>6yXyYqNXfc=kpdL5&G@xdESeIx* zCR*LfD&Qx}ZXy@`>G`i(Q#fJROo` z;CTLaTI5i#cq>kWMS3&UJTU&Q)w~MFr;(_q8OJk}YYbL1J&M))pG417%f=p4_e2tS z<7^P0dX^h`v zdJ-7`3#1V@4ei8S&;ROtCpNX&-+_zVsS{HzS51r=r|ko(cJG7z(HV&;i38t=C6OkB z`RAJ~sc+_<;ElxvR*4si2kHX(P#Fus+j|z{wswe-D?9ZS_`zZ7d?B%#U>bmJ;>${X zxR>aMvLaOs)pTW`#{3eE_y9t8eQYa;hHvGCE84Hn7zqKH%|?I^W$ah28=&(Z&`Tut zqju_zX?I4NOcQOq4d(4;{3H)1_SdYG@E6bwplOB}-4(B_^Az`B+zQ~Bj}16Tz$9qT zGl)r3i-_slCdna5`i|%SHqX!D&_hkz&$JhCsG?vqcb#E~Z!Eg7y>F3s2aUNy^HJr$ zeNe&x3S zS%}bTZcGt^TbUQzRPE$xH}5chXLE&5*M-&`6*C`eO`3$ z?iXqW^&Q~MYewI<4%``N8X>W-aSl=u5gp^S8vqc;&kgeukXM`~OZmr4T$dGcgC6gX zkgU;Y2h#1`NlYYPK*60z)V7@lB`E79(4UV}?u%y(pL&A)A$ustk%Hroe{y^fp63*& zFctQ+cCAra9!Ai&BPGiw-_*hz@pM#>UX<-?dW( zDYoe~d#3vnA1_yC<4mL0xZ@co(ra_K>raG88<+*$A!p&L6JOdN6&%NQd}B#QUW+q- zo5P_-Gt`z=Q6vpIGPcJwYOns7Jj2YC2Fr)&t&cnV1xs~s(Ej6(yAJ8f69x(E^77T#M< zqZp4AZ`p6G*Exn3pmr%-bakN$1_! z~2T5IjUStbC^5#OK{Dz6Od9$M%*Dm{hI z+`;Yd9z@lU@T!}8f1qsKtoKBCm;N=Zma`J2ZnJSs!dPt_6hTmp3i(KQll-V})T?88 zyJ>(hjr*6c%)s{3z#b>tc60~B<~O|5Hc2*r*!fBlpsa(Ls$WZBwZBVRL~0z_Tae{M z#PoTI^r{yToKTO?12aFi%SfTP3!2pes1zU6n8O|y$#!OY)TT3`SAIuEBQ-8Mqo-8| zuSCRd!d-P{4p#OIjfOZFXrJj@73=7wVH+?BUH{5GAaPM(GfdtN_>YqtFc4m_uF=X}&!|JICy@~7>YK#13<|&?!4d?@5$|#h$Mzop13VY`8kC&Y`fxv+- zU_iIQyD#A2-Y`cs&m1x^N3iC88#R`H2pL zYn2(5Z@4*5-Lx1ps7EqLFZ?sRjkk0C$8MT4+JKzmTI_MjuyB7Mg;o<7w4$plj_V%I zFRLr9M(pn%FOLyXiZA!9F6WBo7cWympfr_Zd?v#A(74Nl1pO9|@v)drd{Fk>_qlJC zFHgnmL$L@(b|&d4d~jXf<9iB>`^sceD(oJ^Vme#J@dMx9xZU%bx}#_ym2;&pZjpGS08 z$_c4VxmU49GkPp!3NdSL=)#D>hQiJt7(V|7aG0BU!n;EOG2y(M;MC<~>364`=(eW) z4D?-lE8+Per`I^Akik9v-q$MF3kJ)=I?{`U(V14+RwnPwYTd1ozVyx=4&jLGlU!S5 zA!X}-=CS}CLc?Y4P)W<`&=G6gxLmfRQrGd;K0W&uYIQjCgW$En++UtI)TbEua9Kh= zKq8)veE!E}S`i>o%(}lrYwuMrlnpWKt^iL7l4ivRxA0KIh5|YX)5}i4jRs^{0Pq`) z;f`vyE+wb^d8zctqW6VCKoyrGh`F+2R-5aVtZFot~|m(guGAvvh825w<~TVgFKw6(_SeZ|8RUWkCD>&OE-` z#e znBS}HT}rb$+)&6DSeXA>0A;S`61ndWl@Nkm|K^oeiF zU~zaN=fiU(zC$hsO{W}l6$jmD$Q_n#?xrYfRf7$>`2dbAswE$RBz3lDEKR35A;3=A zgMzb<>wSIQqJB&eDKu%m^z9$G1|p>xE13TFACcje2uD1EW6lHcDPm@s=kt^(=$E(NARX(`Fk3Dw7{UAeTEs!P0=Y5AeWyeaE847-U+w zs4MII&TkmR@utgG$}h!TNZ=VpwZdAUho};DEA533$UZPb^wzwFn5110S7s0W?4B<@ru%ZtWBgaNCt3A^r?Z6X`h#5~UC< zD7lD=V^kddb7{OSEo&ZZbclZ@_r1XF!IDwVq@y7~>QPx;bR7qHNMqRA79^xWa=x<7 zdd|P}?vXkk(0g}-?rD4CS_UA-LdXx-0Q9hO3)WVzIWfZgbpx*_NeF6OlmJMl<6kuD?iAQhSDmhr#}NK z{WuducZp5~mO9l7TRRwP^}wa2$5!pCz$_vbjfc^w%Lr#!d%s@GfTJby4O z&=E-3<8XqD<4ivh-`-o&99w>1t2?lAyEmnGJIWbt^FtfkTF9Z zgE%bz4%`cKQuik@KBzYn3q1z8t>CXXMIbt{23roMPKvQY9!G+=^nq5LW~k*JsDS9{ z?S!ixd3IyUW$_F#s9L(%3Ho{MNJuX*U(OS1jXI3ub%Md*rx)FVq<(9y?%TKf&+W3r^Y}v zW@AXB4rytyfo{umh*a|`>5cVoJag+lsFEx4;U#P{eWhJ@Vj_RUk`|$#yzPA7_K9`w z{4E(`pUFMDAckyUY5|2g7R@M0C=-N)221i(7Lo{M5SNI7cA7|pw(baO!2)#*a+!cD zHJonWR%`{Suu!yb>UYrhH_-RxZ;XQnY7zgG=)IDy2?co)E+3E1myk36t`}%B$`eOn z>l@yuG2Uq%XvjS~P_1?53H)PYUA2S~y*q7rC7@E~%GrQ=gnWoXCiGZP#r$(0V|Dj` zU;rp#6lS3=LWF^|9bbSVnzL(e@*HXAUljL{TQSRJ)e{X@?ui*>X0PS<&r7c*^~Fw# z8P%R+4sixjPx}5(Tte$O03K9W(j~fsT&TS-{{8lh(VcGD{mz=ra5|j$NkAj`lFmnf zEU<&1FFpYhLS{4_H~^9aKnp{?!WgO&S#yOYASRVn)~!PC$ZZdQ!f89%7kV$VAE^g_ z`&_=NN3%Ixe6jME@7JSx$p9O8Ysgs^mI_J@-6QpXZ!Au|T4wR06V9HIuz8XRiAuAA z%XpoBYXV(7$sh>xrq%OnnFU>?r`5k=F`*hj^u`%=^k3_GFs2(a&jcPx4)b-C+8jRf zhavsi50)bx&}nmz&qBzc1_q?7$~6J+5OBxe#w*4+n0#Pl;Q%%A)B3kPOY1(hNozA0 zd`spT#PJxoMA!o6Hqos|gRNrSjd3xn2kUS?%z2f)CQ0H^cTmsliW1%6V*d?ls_Eut z2$R?}#dcgcE~9pY0gM2}?kc^^$OHa?ufQRm-UL;4gN?e+eP^5eQwcYYIBJ10QuQk` zj#tE@M`Tge&mKjN*r>+|$f^t+m>TmtRXlpG#6femRhqjdkj5PV>R;KRtjkvn2`q$; z9LK{a7s?FO<6?@mBh8H#uDtIu%u?_;&=?8&6}UC|q(ME(Z6Li!4VbD<>}?oaSkWDM z2(+@P>+HS$Ye37jnoPF@uRHx_@u`OA2i6;`=t#l1&|c?@k6l-RS4#qNxN}A+Vg>Ew zin=n}?E>IvWZFQPL{S5O^Ie%Fg`A5D;g7YF0H^wNII}n-5!ni^|4PN7W?*g`owI8P zl^MmR)B7>YB|d=HcP2S3j=#BChnRZo&y|)h3Gng{eKvP=PH8!xSK$pZQE;j_coa!9 zVlsFl?3DCG<|%g;FCTZnPhOT}wdl%}=Wa@IuO6HXzo;mvpwlO%0t(|k2|QF}#jq?X z{?*zyguM;QivE<-UDz0zuml%($@FRgtdhXZsJOcALaS4W%&wi_QS|)0_J}Fu0ni)}5xGkM82zCOr)>S8^#< z$gOb=PLZR1%hS8?i(auS>_Fc`Et$;hutm3{@6QG)Qv7fRwzs~a?|56?l3BY&)+MnY z(qMe=X&ybuX!5w+vQnTQY21(|vnRhp-JWH~#$Y5v*ZR9_dz$d`&u07#F0m}-O~^|O zmrOU!&h%`)n3;%Y)M^G4rC=MMz>lXV3omr$!x{Bh(3Fh@geNPoe-rYc!gt#r_UZJ# zy@vyGmUQ%wDT&V}H0apDdD3h9ESp*fuS2+4fVa$TmHYm?<3Yy-yvZ82eFtJJzN{|y43(Msje)f2$uWu@sotPvOlZu#g_|2* z2!-lCrq9eLyGt4i@frrAYIq2#l=*+#SMsB3f)2-O8W<2aD3YugNBC}8{w&>HK)hhs zLlyq2z<^*MworLcn=^H=h3VY3GkJyD8d_a$jPw#%h*5`CV8(_HIK$CJDIG;=v+J&^d$6 zWu$QNLsHolEn(N*=R!a7R(M#F90m0%PsYZS*0i_=^viBdthx zAt5+b;6Ge~)s4;c_h)u3%!i8*@8#NcvNJI3J-R+|mL zA+}z;lm}+?y$7RX{kkjLi1zVzN2Q^d@*2_|GT=fMV>3r4a>$ntN7|`3hQiD7|7>wC z4R?&}6u9jv^?C%Sd1M;o>y)E3BlvXLwt3t&GaA4|9)gK{Mp71?^c{XYl8>}%Iak$Q z6|XzEeTrxJfdPG=R`n$cpL6>u-cgIfH29~8Tg*mNfcYsLy5DND>1v&3elZUeeasxp z)M)Al1y7+$1IKHKgjdQn?`?v>|9Ej@i))O;yM3OZy2oW6tO6=@FzC7%M~nnpBxd-| z(r`CyS!v&Nz}-T8>Mw|tIAg15?d7bL$c~pB&B9BZDX8h>!Zmh9Hx@0HmY!<=n#AfJ zlrHHvo*jqD%iFKHjV5$eQl+qEa?|g&i`*=5-2&3NNb!r5|7Sa^3L|I7XCHrc%jVaH z Date: Thu, 2 Jun 2022 15:53:29 -0700 Subject: [PATCH 32/60] add operation forwarding state --- doc/dualtor/active_active_hld.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/doc/dualtor/active_active_hld.md b/doc/dualtor/active_active_hld.md index b3881551ef..80019b573b 100644 --- a/doc/dualtor/active_active_hld.md +++ b/doc/dualtor/active_active_hld.md @@ -31,7 +31,7 @@ This document provides the high level design of SONiC dual toR solution, support - [3.3 Linkmgrd](#33-linkmgrd) - [3.3.1 Link Prober](#331-link-prober) - [3.3.2 Link State](#332-link-state) - - [3.3.3 Admin Forwarding State](#333-admin-forwarding-state) + - [3.3.3 Forwarding State](#333-forwarding-state) - [3.3.4 Acitve-Active State Machine](#334-acitve-active-state-machine) - [3.3.5 Default route to T1](#335-default-route-to-t1) - [3.3.6 Incremental Featrues](#336-incremental-featrues) @@ -67,6 +67,7 @@ Note that, this complexity can be handled by active-active smart cables, or any 1. Server should provide support for ToR to control traffic forwarding, and follow this control when dispensing traffic. * gRPC is introduced for this requirement. * Each ToR will have a well-known IP. Server NIC should dispatch gRPC replies towards these IPs to the corresponding uplinks. +1. Server NIC should avoid sending traffic through unhealthy links when detecting a link state down. 1. Server should replicate these northbound traffic to both ToRs: * Specified ICMP replies (for probing link health status) * ARP propagation @@ -290,8 +291,13 @@ Linkmgrd will provide the determination of a ToR / link's readiness for use. #### 3.3.2 Link State When link is down, linkmgrd will receive notification from SWSS based on kernel message from netlink. This notification will be used to determine if ToR is healthy. -#### 3.3.3 Admin Forwarding State - ToRs will signal NIC if the link is active / standby, we will call this active / standby state as admin forwarding state. It's up to NIC to determine which link to use if both are active, but it should never choose to use a standby link. This logic provides ToR more control over traffic forwarding. +#### 3.3.3 Forwarding State + +**Admin Forwarding State** + ToRs will signal NIC if the link is active / standby, we will call this active / standby state as **admin forwarding state**. It's up to NIC to determine which link to use if both are active, but it should never choose to use a standby link. This logic provides ToR more control over traffic forwarding. + +**Operational Forwarding State** + Server side should maintain an operational forwarding state as well. When link is down, eventually admin forwarding state will be updated to standby. But before that, if server side detects link down, it should stop sending traffic through this link even the admin state is active. In this way, we ensure the ToRs have control over traffic forwarding, and also guarantee immediate reaction when link state is down. #### 3.3.4 Acitve-Active State Machine Active-acitve state transition logics are simplified compared to active-standby. In active-standby, linkmgrd makes mux toggle decisions based on y-cable direction, while for active-active, two links are more independent. Linkmgrd will only make state transition decisions based on healthy indicators. From 5f7ea7c19f6e40ab0afde801b273c428b0874d99 Mon Sep 17 00:00:00 2001 From: Lior Avramov <73036155+liorghub@users.noreply.github.com> Date: Tue, 7 Jun 2022 15:01:10 +0300 Subject: [PATCH 33/60] IP interface loopback action HLD (#1006) This HLD document is describing IP interface loopback action feature. Co-authored-by: liora --- .../images/feature_overview.svg | 3 + .../loopback-action/images/interface_vlan.svg | 3 + .../ip-interface-loopback-action-design.md | 361 ++++++++++++++++++ 3 files changed, 367 insertions(+) create mode 100755 doc/ip-interface/loopback-action/images/feature_overview.svg create mode 100755 doc/ip-interface/loopback-action/images/interface_vlan.svg create mode 100644 doc/ip-interface/loopback-action/ip-interface-loopback-action-design.md diff --git a/doc/ip-interface/loopback-action/images/feature_overview.svg b/doc/ip-interface/loopback-action/images/feature_overview.svg new file mode 100755 index 0000000000..3518d45921 --- /dev/null +++ b/doc/ip-interface/loopback-action/images/feature_overview.svg @@ -0,0 +1,3 @@ + + +
5.5.5.5 via 1.1.1.2
5.5.5.5 via 1.1.1.2
route table
route table
dip: 5.5.5.5
sip: any
dip: 5.5.5.5...
packet
packet
1.1.1.1/24
1.1.1.1/24
1.1.1.2/24
1.1.1.2/24
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/doc/ip-interface/loopback-action/images/interface_vlan.svg b/doc/ip-interface/loopback-action/images/interface_vlan.svg new file mode 100755 index 0000000000..70143e6b1f --- /dev/null +++ b/doc/ip-interface/loopback-action/images/interface_vlan.svg @@ -0,0 +1,3 @@ + + +CLIset VLAN_INTERFACE|Vlan100{loopback_action:drop}ConfigDBreturn
verify user input 
verify user...
IntfMgrdnotify VLAN_INTERFACE|Vlan100{loopback_action:drop}
postpone handling until iface exist in state DB
postpone handling unt...
AppDBset INTF_TABLE|Vlan100{loopback_action:drop}returnSAIIntfOrchnotify INTF_TABLE|Vlan100{loopback_action:drop}call set_router_interface_attribute SAI_ROUTER_INTERFACE_ATTR_LOOPBACK_PACKET_ACTIONreturn
cache update
log error if failed
cache update...
Loopback action set on Interface VLAN
Loopback action set on Interface VLAN
CLI
CLI
ConfigDB
ConfigDB
IntfMgrd
IntfMgrd
AppDB
AppDB
IntfOrch
IntfOrch
SAI
SAI
verify data
cache check
If already set, do nothing
verify data...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/doc/ip-interface/loopback-action/ip-interface-loopback-action-design.md b/doc/ip-interface/loopback-action/ip-interface-loopback-action-design.md new file mode 100644 index 0000000000..76ea8deed5 --- /dev/null +++ b/doc/ip-interface/loopback-action/ip-interface-loopback-action-design.md @@ -0,0 +1,361 @@ +# SONiC IP Interface Loopback Action +## High level design document +## Table of contents +- [Revision](#revision) +- [Scope](#scope) +- [1 Introduction](#1-introduction) + - [1.1 Feature overview](#11-feature-overview) + - [1.2 Requirements](#12-requirements) + - [1.2.1 Functionality](#121-functionality) + - [1.2.2 Command interface](#122-command-interface) + - [1.2.3 Error handling](#123-error-handling) + - [1.2.4 Event logging](#124-event-logging) +- [2 Design](#2-design) + - [2.1 Overview](#21-overview) + - [2.2 DB schema](#22-db-schema) + - [2.2.1 Config DB](#221-config-db) + - [2.2.2 App DB](#222-app-db) + - [2.2.3 Configuration migration](#223-configuration-migration) + - [2.3 Flows](#23-flows) + - [2.3.1 Loopback action set interface vlan](#231-loopback-action-set-interface-vlan) + - [2.3.1.1 Handle set in runtime](#2311-handle-set-in-runtime) + - [2.3.1.2 Handle set in init](#2312-handle-set-in-init) + - [2.3.2 Loopback action set interface Ethernet](#232-loopback-action-set-interface-ethernet) + - [2.3.3 Loopback action set interface port-channel](#233-loopback-action-set-interface-port-channel) + - [2.3.4 Loopback action set subinterface](#234-loopback-action-set-subinterface) + - [2.3.5 IP interface creation](#235-ip-interface-creation) + - [2.4 SAI](#24-sai) + - [2.5 Statistics](#25-statistics) + - [2.6 CLI](#26-cli) + - [2.6.1 Config command](#261-config-command) + - [2.6.2 Show command](#262-show-command) + - [2.7 YANG model](#27-yang-model) + - [2.8 Warm/Fast boot](#28-warmfast-boot) +- [3 Test plan](#3-test-plan) + - [3.1 Unit tests via VS](#31-unit-tests-via-vs) + - [3.2 System tests](#32-system-tests) + +## Revision +| Rev | Date | Author | Description | +|:---:|:----------:|:--------------:|:----------------| +| 0.1 | 18/05/2022 | Lior Avramov | Initial version | + +## Scope +This document describes the high level design of IP interface loopback action feature in SONiC + +## List of figures +[Figure 1: feature overview](#figure-1-feature-overview) +[Figure 2: interface vlan](#figure-2-interface-vlan) + +# 1 Introduction +## 1.1 Feature overview +IP interface loopback action is a feature that allows user to change the way router handles routed packets for which egress port equals to ingress port. +1. When loopback action is configured to drop, those packets will be dropped. Drppoed packets due to loopback action are counted in rif statistics, see [2.5 Statistics](#25-statistics) +2. When loopback action is configured to forward, those packets will be forwarded as the pipeline defined. + +![feature overview](images/feature_overview.svg "Figure 1: feature overview") +###### Figure 1: feature overview + +## 1.2 Requirements +### 1.2.1 Functionality +**This feature will support the following functionality:** +1. Loopback action can be set on an IP interface. +2. An IP Interface can be one of the following: + 1. Interface vlan + 2. Interface Ethernet + 3. Interface port-channel + 4. Subinterface +3. Loopback action can be set to "drop" or "forward". +4. CLI will reject loopback action setting on a non IP interface. Interface is considered as an IP interface if it has entry in: + 1. VLAN_INTERFACE table for interface vlan (e.g. VLAN_INTERFACE|Vlan100) + 2. INTERFACE table for interface Ethernet (e.g. INTERFACE|Ethernet232) + 3. PORTCHANNEL_INTERFACE table for interface port-channel (e.g. PORTCHANNEL_INTERFACE|PortChannel1) + 4. VLAN_SUB_INTERFACE table for subinterface (e.g. VLAN_SUB_INTERFACE|Ethernet0.10) +5. The configured loopback action can be viewed by show command in CLI. +6. When SONiC configuration of loopback action is missing the system will behave as it is today, based on SAI behavioural model, forward the loopbacked packets. +7. No changes required in Kernel. + +### 1.2.2 Command interface +**This feature will support the following commands:** +1. config: set IP interface loopback action. +2. show: display the configured loopback action. + +### 1.2.3 Error handling +**This feature will provide error handling for the next situations:** +1. In CLI: invalid action, invalid interface, non ip interface +2. In SWSS: invalid action, invalid DB operation, invalid interface + +### 1.2.4 Event logging +**This feature will provide event logging for:** loopback action set on IP interface. + +###### Table 1: Event logging +| Event | Severity | +|:------------------------------------------|:---------| +| IP interface loopback action set: success | NOTICE | +| IP interface loopback action set: error | ERROR | + +# 2 Design +## 2.1 Overview +Intfmgrd subscribes for changes in L3 interface tables VLAN_INTERFACE, INTERFACE and PORTCHANNEL_INTERFACE in config DB. Whenever there is a change in one of these tables, intfmgrd is notified. Intfmgrd then updates INTF_TABLE table in app DB. Upon change in INTF_TABLE, intforch is notified. +Intforch performs validity checks, call the relevant SAI API and updates internal cache. The flow in intfmgr is based on the current interface configuration flow. + +## 2.2 DB schema +### 2.2.1 Config DB +To support loopback action set on L3 interface, a new field-value pair is defined in CONFIG_DB in the following tables. +Valid values are "drop" or "forward". + +1. VLAN_INTERFACE +``` +VLAN_INTERFACE|interface-name + "loopback_action": action (OPTIONAL) +``` +Example: +``` +"VLAN_INTERFACE": { + "Vlan100": { + "loopback_action": "drop", + "mac_addr": "00:01:02:03:04:10", + "ipv6_use_link_local_only": "enable" + }, +} +``` + +2. INTERFACE +``` +INTERFACE|interface-name + "loopback_action": action +``` +Example: + +``` +"INTERFACE": { + "Ethernet248": { + "loopback_action": "forward", + "mac_addr": "00:01:02:03:04:11", + "ipv6_use_link_local_only": "enable" + }, +} +``` +3. PORTCHANNEL_INTERFACE +``` +PORTCHANNEL_INTERFACE|interface-name + "loopback_action": action +``` +Example: +``` +"PORTCHANNEL_INTERFACE": { + "PortChannel1": { + "loopback_action": "drop", + "mac_addr": "00:01:02:03:04:12", + "ipv6_use_link_local_only": "enable" + }, +} +``` + +4. VLAN_SUB_INTERFACE +``` +VLAN_SUB_INTERFACE|interface-name + "loopback_action": action +``` +Example: +``` +"VLAN_SUB_INTERFACE": { + "Ethernet0.10": { + "loopback_action": "drop", + "mac_addr": "00:01:02:03:04:12", + "ipv6_use_link_local_only": "enable" + }, +} +``` + +### 2.2.2 App DB +To support loopback action set on L3 interface, a new field-value pair is defined in APP DB in table INTF_TABLE. +``` +INTF_TABLE|interface-name + "loopback_action": action +``` +Example for interface vlan: +``` + "INTF_TABLE": { + "Vlan100": { + "loopback_action": "drop", + "mac_addr": "00:01:02:03:04:10", + "ipv6_use_link_local_only": "enable" + +``` +Example for interface Ethernet: +``` + "INTF_TABLE": { + "Ethernet248": { + "loopback_action": "drop", + "mac_addr": "00:01:02:03:04:11", + "ipv6_use_link_local_only": "enable" + } + } +``` +Example for interface port-channel: +``` + "INTF_TABLE": { + "PortChannel1": { + "loopback_action": "drop", + "mac_addr": "00:01:02:03:04:12", + "ipv6_use_link_local_only": "enable" + } + } +``` +Example for subinterface: +``` + "INTF_TABLE": { + "Ethernet0.10": { + "loopback_action": "drop", + "mac_addr": "00:01:02:03:04:12", + "ipv6_use_link_local_only": "enable" + } + } +``` + +### 2.2.3 Configuration migration +When upgrading from SW image which does not support the new schema to a one which supports, the new image will not contain loopback action configuration. All existing IP interfaces will behave as today, based on SAI behavioural model, forward the loopbacked packets. + +## 2.3 Flows + +### 2.3.1 Loopback action set interface vlan +#### 2.3.1.1 Handle set in runtime +![interface vlan](images/interface_vlan.svg "Figure 2: interface vlan") +###### Figure 2: interface vlan + +#### 2.3.1.2 Handle set in init +In init, loopback action configuration is being handled as part of the IP interface creation. +During init, all field-value pairs of each key in INTF_TABLE table (e.g. INTF_TABLE|Vlan100) are being received in intfOrch together at once. +Those field-value pairs are the interface attributes, e.g. mac address, loopback action etc. + +### 2.3.2 Loopback action set interface Ethernet +Loopback action set on interface Ethernet flow is the same as interface vlan flow besides config DB and app DB keys being used. Used keys are defined in [2.2.1 Config DB](#221-config-db). + +### 2.3.3 Loopback action set interface port-channel +Loopback action set on interface port-channel flow is the same as interface vlan flow besides config DB and app DB keys being used. Used keys are defined in [2.2.1 Config DB](#221-config-db). + +### 2.3.4 Loopback action set subinterface +Loopback action set on subinterface flow is the same as interface vlan flow besides config DB and app DB keys being used. Used keys are defined in [2.2.1 Config DB](#221-config-db). + +### 2.3.5 IP interface creation +If loopback action was not configured by the user, default loopback action is derived from SAI behavioral model which is forward. + +## 2.4 SAI +The following will be used for setting IP interface loopback action. + +SAI API: +``` +sai_router_intfs_api->set_router_interface_attribute() +sai_router_intfs_api->create_router_interface() +``` + +SAI attribute: +###### Table 2: SAI attribute +| Loopback action | SAI attribute | Attribute value | +|------------------|---------------------------------------------------|----------------------------| +| drop | SAI_ROUTER_INTERFACE_ATTR_LOOPBACK_PACKET_ACTION | SAI_PACKET_ACTION_DROP | +| forward | SAI_ROUTER_INTERFACE_ATTR_LOOPBACK_PACKET_ACTION | SAI_PACKET_ACTION_FORWARD | + + +``` +typedef enum _sai_router_interface_attr_t +{ + /** + * @brief Packet action when a packet ingress and gets routed on the same RIF + * + * @type sai_packet_action_t + * @flags CREATE_AND_SET + * @default SAI_PACKET_ACTION_FORWARD + */ + SAI_ROUTER_INTERFACE_ATTR_LOOPBACK_PACKET_ACTION, + +} sai_router_interface_attr_t; +``` + +## 2.5 Statistics +Packets that are dropped due to loopback action will be counted in TX_ERR in IP interface statistics. +``` +root@r-lionfish-14:/home/admin# show interfaces counters rif + IFACE RX_OK RX_BPS RX_PPS RX_ERR TX_OK TX_BPS TX_PPS TX_ERR +------------ ------- -------- -------- -------- ------- -------- -------- -------- + Ethernet236 4 0.00 B/s 0.00/s 1 0 0.00 B/s 0.00/s 0 +PortChannel1 0 0.00 B/s 0.00/s 0 0 0.00 B/s 0.00/s 0 + Vlan2 0 0.00 B/s 0.00/s 0 0 0.00 B/s 0.00/s 0 +Ethernet0.10 0 0.00 B/s 0.00/s 0 0 0.00 B/s 0.00/s 0 +``` + +## 2.6 CLI +### 2.6.1 Config command +A new SONiC CLI command is introduced to configure IP interface loopback action. +``` +# Set loopback action per INTERFACE/PORTCHANNEL_INTERFACE/VLAN_INTERFACE/VLAN_SUB_INTERFACE +config interface loopback-action drop|forward +``` + +Examples: +``` +config interface loopback-action Ethernet248 drop +config interface loopback-action Vlan100 forward +``` + +### 2.6.2 Show command +A new SONiC CLI command is introduced to show the configured loopback action. +IP interfaces that user did not configure loopback action on them, will not be shown in the table. +``` +show ip interfaces loopback-action +``` + +Example: +``` +root@sonic:~# show ip interfaces loopback-action +Interface Action +------------ ---------- +Ethernet232 drop +Vlan100 forward +``` + +## 2.7 YANG model +The following YANG models will be extended in order to provide support for loopback action: +1. sonic-interface.yang -> container INTERFACE +2. sonic-portchannel.yang -> container PORTCHANNEL_INTERFACE +3. sonic-vlan.yang -> container VLAN_INTERFACE +4. sonic-vlan-sub-interface.yang -> container VLAN_SUB_INTERFACE + +New leaf loopback_action will be added: +``` +leaf loopback_action { + description "Packet action when a packet ingress and gets routed on the same IP interface"; + type string { + pattern "drop|forward"; + } +} +``` + +## 2.8 Warm/Fast boot +No special handling is required + +# 3 Test plan +## 3.1 Unit tests via VS +Add the following test case in file sonic-swss/tests/test_interface.py. +1. Create IP interface by writing to config DB +2. Set loopback action on IP interface +3. Check table INTF_TABLE in App DB +4. Check table SAI_OBJECT_TYPE_ROUTER_INTERFACE in ASIC DB +5. Create port-channel IP interface and repeat steps 2 to 4. +6. Create interface VLAN and repeat steps 2 to 4. +7. Create subinterface and repeat steps 2 to 4. + +## 3.2 System tests +Add the following test in sonic-mgmt. +1. Create IP interface Ethernet. +2. Loopback action not configured, send traffic, verify loopbacked packets are forwarded (SAI default). +3. Set loopback action to drop, send traffic, verify loopbacked packets are dropped and TX_ERR in rif counter increased. +4. Save config and reboot, send traffic, verify loopbacked packets are dropped and TX_ERR in rif counter increased. +5. Set loopback action to forward, send traffic, verify loopbacked packets are forwarded. +6. Save config and reboot, send traffic, verify loopbacked packets are forwarded. +7. Create port-channel IP interface and repeat steps 2 to 6. +8. Create interface VLAN and repeat steps 2 to 6. +9. Create subinterface and repeat steps 2 to 6. +10. Set loopback action on non IP interface. +11. Set loopback action on non existing interface. From c8412e7512b930556871d00500ce4341db1e42e5 Mon Sep 17 00:00:00 2001 From: kannankvs Date: Wed, 8 Jun 2022 10:23:46 +0530 Subject: [PATCH 34/60] 202111 build update for SONiC image link (#1011) * Updated the build image link for commit diff As discussed, we have updated the build image with commit diff details for all the builds generated. * Updated the build image for 202111 release Updated the build image for 202111 release * Updated the build image for 202111 release Updated the build image for 202111 release * Updated MoM file till May month Updated MoM file till May month --- MoM.html | 74 ++++++++++++++++++++++++++++++++++- generate_sonic_image_links.sh | 2 +- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/MoM.html b/MoM.html index 449922cdab..88c8870acb 100755 --- a/MoM.html +++ b/MoM.html @@ -104,6 +104,76 @@

SONiC community meeting minutes

Links To Meeting Agenda Links To Minutes Of The meeting + +   May 31 2022    +
Platform_Integration_Testing + MoM + + +   May 24 2022    + Active-Active dual ToR + MoM + + +   May 17 2022    + Systemd bootchart Integration & Syslog Source IP config + MoM + + +   May 10 2022    + 202205 Release Status + MoM + + +   May 03 2022    + No Meeting + MoM + + +   Apr 26 2022    + SAI PTF + MoM + + +   Apr 19 2022    + Fast-reboot Flow enhancements + MoM + + +   Apr 12 2022    + No Meeting + MoM + + +   Apr 05 2022    + No Meeting + MoM + + +   Mar 29 2022    + DSCP/TC Remapping for Tunnel traffic HLD + MoM + + +   Mar 22 2022    + SONiC OpenSSL FIPS & CONFIG RELOAD ENHANCEMENT + MoM + + +   Mar 15 2022    + Batch Requests API HLD + MoM + + +   Mar 08 2022    + House Cleaning + MoM + + +   Mar 01 2022    + Build-Enhancements + MoM +   Feb 22 2022    auto-techsupport @@ -146,12 +216,12 @@

SONiC community meeting minutes

  Dec 28 2021    - Route Flow Counter + No Meeting MoM   Dec 21 2021    - Route Flow Counter + No Meeting MoM diff --git a/generate_sonic_image_links.sh b/generate_sonic_image_links.sh index 6063b5fa23..106d32bdfa 100644 --- a/generate_sonic_image_links.sh +++ b/generate_sonic_image_links.sh @@ -24,7 +24,7 @@ DEFID_NPH="$(curl -s 'https://dev.azure.com/mssonic/build/_apis/build/definition echo '{' > sonic_image_links.json first=1 -for BRANCH in master 202106 202012 201911 201811 +for BRANCH in master 202111 202106 202012 201911 201811 do if [ -z "${first}" ]; then echo ',' >> sonic_image_links.json From d71545b6dbcbd989510d0b6792ae7ae9531f1fe8 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Wed, 8 Jun 2022 10:21:08 -0700 Subject: [PATCH 35/60] add further enhancement --- doc/dualtor/active_active_hld.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/doc/dualtor/active_active_hld.md b/doc/dualtor/active_active_hld.md index 80019b573b..3a3d5d44ff 100644 --- a/doc/dualtor/active_active_hld.md +++ b/doc/dualtor/active_active_hld.md @@ -41,7 +41,8 @@ This document provides the high level design of SONiC dual toR solution, support - [3.5 Transceiver Daemon](#35-transceiver-daemon) - [3.5.1 Cable Control through gRPC](#351-cable-control-through-grpc) - [3.6 State Transition Flow](#36-state-transition-flow) - - [3.7 Command Line](#37-command-line) + - [3.7 Further Enhancement](#37-further-enhancement) + - [3.8 Command Line](#38-command-line) [4 Warm Reboot Support](#4-warm-reboot-support) @@ -430,7 +431,16 @@ The following UML sequence illustrates the state transtion when linkmgrd state m ![state transition flow](./image/state_transition_flow.png) -### 3.7 Command Line +### 3.7 Further Enhancement +**Advertise updated routes to T1** +Current failover strategy can smoothly handle the link failure cases, but if one of the ToRs crashes, and if T1 still sends traffic to the crashed ToR, we will see packet loss. + +A further improvement in rescuing scenario, is when detecting peer's unhealthy status, local ToR advertises specific routes (i.e. longer prefix), so that traffic from T1 does't go to crashed ToR as all. + +**Server Servicing & ToR Upgrade** +For server graceful restart, We already have gRPC service defined in [3.5.1](#351-cable-control-through-grpc). An indicator of ongoing server servicing should be defined based on that notification, so ToR can avoid upgrades in the meantime. Vice versa, we can also define gRPC APIs to notify server when ToR upgrade is ongoing. + +### 3.8 Command Line TBD ## 4 Warm Reboot Support From 60a95c2fad079f3ac0e25c09c427b9d8d660f736 Mon Sep 17 00:00:00 2001 From: kannankvs Date: Wed, 15 Jun 2022 10:18:33 +0530 Subject: [PATCH 36/60] Updated Innovium to Marvel (#1015) Updated Innovium to Marvel --- Supported-Devices-and-Platforms.html | 4 ++-- supported_devices_platforms_md.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Supported-Devices-and-Platforms.html b/Supported-Devices-and-Platforms.html index 53d8a72eef..fe11a034c5 100644 --- a/Supported-Devices-and-Platforms.html +++ b/Supported-Devices-and-Platforms.html @@ -551,7 +551,7 @@

Innovium +Marvell Teralynx 7 128x100G @@ -749,7 +749,7 @@

Innovium +Marvell Teralynx 7 32x400G diff --git a/supported_devices_platforms_md.sh b/supported_devices_platforms_md.sh index fa3d0f76e0..b9c4efb779 100644 --- a/supported_devices_platforms_md.sh +++ b/supported_devices_platforms_md.sh @@ -106,7 +106,7 @@ echo "| 34 | Barefoot | Wedge 100BF-32 | Barefoot | Tofino echo "| 35 | Barefoot | Wedge 100BF-65X | Barefoot | Tofino | 32x100G | [SONiC-ONIE-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-barefoot.bin/')) |" >> supported_devices_platforms.md echo "| 36 | Celestica | DX010 | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md echo "| 37 | Celestica | E1031 | Broadcom | Helix4 | 48x1G + 4x10G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 38 | Celestica | midstone-200i | Innovium | Teralynx 7 | 128x100G |[SONiC-ONIE-Innovium]($(echo "${ARTF_INNO}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-innovium-dbg.bin/')) |" >> supported_devices_platforms.md +echo "| 38 | Celestica | midstone-200i | Marvell | Teralynx 7 | 128x100G |[SONiC-ONIE-Innovium]($(echo "${ARTF_INNO}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-innovium-dbg.bin/')) |" >> supported_devices_platforms.md echo "| 39 | Celestica | Silverstone | Broadcom | Tomahawk 3 | 32x400G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md echo "| 40 | Celestica | Seastone_2 | Broadcom | Trident 3 | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md echo "| 41 | Centec | E582-48X2Q | Centec | Goldengate | 48x10G + 2x40G + 4x100G | [SONiC-ONIE-Centec]($(echo "${ARTF_CTC}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-centec.bin/')) |" >> supported_devices_platforms.md @@ -131,7 +131,7 @@ echo "| 59 | Delta | AG5648 | Broadcom | Tomahawk | echo "| 60 | Delta | AG9032V1 | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md echo "| 61 | Delta | AG9032V2A | Broadcom | Trident 3 | 32x100G + 1x10G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md echo "| 62 | Delta | AG9064 | Broadcom | Tomahawk 2 | 64x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 63 | Delta | et-c032if | Innovium | Teralynx 7 | 32x400G |[SONiC-ONIE-Innovium]($(echo "${ARTF_INNO}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-innovium-dbg.bin/')) |" >> supported_devices_platforms.md +echo "| 63 | Delta | et-c032if | Marvell | Teralynx 7 | 32x400G |[SONiC-ONIE-Innovium]($(echo "${ARTF_INNO}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-innovium-dbg.bin/')) |" >> supported_devices_platforms.md echo "| 64 | Delta | ET-6448M | Marvell | Prestera 98DX3255 | 48xGE + 4x10G | [SONiC-ONIE-Marvell]($(echo "${ARTF_MRV}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-marvell-armhf.bin/')) |" >> supported_devices_platforms.md echo "| 65 | Delta | agc032 | Broadcom | Tomahawk3 | 32x400G + 2x10G | [SONiC-ONIE-Marvell]($(echo "${ARTF_MRV}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-marvell-armhf.bin/')) |" >> supported_devices_platforms.md echo "| 66 | Embedway | ES6220 (48x10G) | Centec | Goldengate | 48x10G + 2x40G + 4x100G | [SONiC-ONIE-Centec]($(echo "${ARTF_CTC}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-centec.bin/')) |" >> supported_devices_platforms.md From 555c3b298e4330b71e453bd68b7ad5ec42d67872 Mon Sep 17 00:00:00 2001 From: Nazarii Hnydyn Date: Sun, 19 Jun 2022 13:54:02 +0300 Subject: [PATCH 37/60] [ssip]: Syslog Source IP configuration HLD (#1002) Signed-off-by: Nazarii Hnydyn --- doc/syslog/images/ssip_add_flow.svg | 232 ++++++++++ doc/syslog/images/ssip_remove_flow.svg | 231 ++++++++++ doc/syslog/syslog-design.md | 558 +++++++++++++++++++++++++ 3 files changed, 1021 insertions(+) create mode 100755 doc/syslog/images/ssip_add_flow.svg create mode 100755 doc/syslog/images/ssip_remove_flow.svg create mode 100644 doc/syslog/syslog-design.md diff --git a/doc/syslog/images/ssip_add_flow.svg b/doc/syslog/images/ssip_add_flow.svg new file mode 100755 index 0000000000..bac8e8a70a --- /dev/null +++ b/doc/syslog/images/ssip_add_flow.svg @@ -0,0 +1,232 @@ + + + + + ssip add flow + + + + + + + + + + + + + + + + + + + Page-7 + + Actor lifeline.1378 + config- db + + Sheet.1046 + + + + Sheet.1047 + + + + Sheet.1048 + + + Sheet.1049 + + + + + config- db + + + Object lifeline.1383 + rsyslog-config + + Sheet.1051 + + + + Sheet.1052 + + + + Sheet.1053 + + + Sheet.1054 + + + + + rsyslog-config + + + Object lifeline.1388 + rsyslog + + Sheet.1056 + + + + Sheet.1057 + + + + Sheet.1058 + + + Sheet.1059 + + + + + rsyslog + + + Actor lifeline.1087 + CLI + + Sheet.1061 + + + + Sheet.1062 + + + + Sheet.1063 + + + Sheet.1064 + + + + + CLI + + + Activation.1098 + + + + Self Message.1099 + process data + + + process data + + Activation.1102 + + + + Self Message.1103 + add syslog server + + + add syslog server + + Activation.1104 + + + + Message.1105 + HMSET SYSLOG_SERVER|key + + + HMSET SYSLOG_SERVER|key + + Activation.1106 + + + + Return Message.1107 + + + + Activation.1162 + + + + Message.1165 + systemctl restart rsyslog-config + + + systemctl restart rsyslog-config + + Return Message.1167 + + + + Activation.1188 + + + + Self Message.1189 + generate rsyslogd config + + + generate rsyslogd config + + Activation.1190 + + + + Message.1191 + HGETALL SYSLOG_SERVER|key + + + HGETALL SYSLOG_SERVER|key + + Activation.1192 + + + + Return Message.1193 + + + + Activation.1196 + + + + Message.1198 + systemctl restart rsyslog + + + systemctl restart rsyslog + + Return Message.1199 + + + + Activation.1200 + + + + diff --git a/doc/syslog/images/ssip_remove_flow.svg b/doc/syslog/images/ssip_remove_flow.svg new file mode 100755 index 0000000000..c2d3b42be6 --- /dev/null +++ b/doc/syslog/images/ssip_remove_flow.svg @@ -0,0 +1,231 @@ + + + + + ssip remove flow + + + + + + + + + + + + + + + + + + + Page-8 + + Actor lifeline.1203 + config- db + + Sheet.1005 + + + + Sheet.1006 + + + + Sheet.1007 + + + Sheet.1008 + + + + + config- db + + + Object lifeline.1208 + rsyslog-config + + Sheet.1010 + + + + Sheet.1011 + + + + Sheet.1012 + + + Sheet.1013 + + + + + rsyslog-config + + + Object lifeline.1213 + rsyslog + + Sheet.1015 + + + + Sheet.1016 + + + + Sheet.1017 + + + Sheet.1018 + + + + + rsyslog + + + Actor lifeline.1252 + CLI + + Sheet.1020 + + + + Sheet.1021 + + + + Sheet.1022 + + + Sheet.1023 + + + + + CLI + + + Activation.1270 + + + + Self Message.1271 + process data + + + process data + + Activation.1272 + + + + Self Message.1273 + remove syslog server + + + remove syslog server + + Activation.1274 + + + + Message.1275 + DEL SYSLOG_SERVER|key + + + DEL SYSLOG_SERVER|key + + Activation.1276 + + + + Return Message.1277 + + + + Activation.1278 + + + + Message.1279 + systemctl restart rsyslog-config + + + systemctl restart rsyslog-config + + Return Message.1280 + + + + Activation.1285 + + + + Self Message.1286 + generate rsyslogd config + + + generate rsyslogd config + + Activation.1287 + + + + Message.1288 + HGETALL SYSLOG_SERVER|key + + + HGETALL SYSLOG_SERVER|key + + Activation.1289 + + + + Return Message.1111 + + + + Activation.1112 + + + + Message.1292 + systemctl restart rsyslog + + + systemctl restart rsyslog + + Return Message.1293 + + + + Activation.1294 + + + + diff --git a/doc/syslog/syslog-design.md b/doc/syslog/syslog-design.md new file mode 100644 index 0000000000..702c3a8bd7 --- /dev/null +++ b/doc/syslog/syslog-design.md @@ -0,0 +1,558 @@ +# SONiC Syslog Source IP + +## High Level Design document + +## Table of contents + +- [Revision](#revision) +- [About this manual](#about-this-manual) +- [Scope](#scope) +- [Abbreviations](#abbreviations) +- [1 Introduction](#1-introduction) + - [1.1 Feature overview](#11-feature-overview) + - [1.2 Requirements](#12-requirements) + - [1.2.1 Functionality](#121-functionality) + - [1.2.2 Command interface](#122-command-interface) + - [1.2.3 Error handling](#123-error-handling) + - [1.2.4 Event logging](#124-event-logging) +- [2 Design](#2-design) + - [2.1 Overview](#21-overview) + - [2.2 Syslog Forwarding Output Module](#22-syslog-forwarding-output-module) + - [2.2.1 Overview](#221-overview) + - [2.2.2 IpFreeBind](#222-ipfreebind) + - [2.3 Configuration agent](#23-configuration-agent) + - [2.3.1 Overview](#231-overview) + - [2.3.2 SSIP parameters](#232-ssip-parameters) + - [2.3.3 SSIP configuration](#233-ssip-configuration) + - [2.3.3.1 VRF/Source: `unset/unset`](#2331-vrfsource-unsetunset) + - [2.3.3.2 VRF/Source: `unset/set`](#2332-vrfsource-unsetset) + - [2.3.3.3 VRF/Source: `set/unset`](#2333-vrfsource-setunset) + - [2.3.3.4 VRF/Source: `set/set`](#2334-vrfsource-setset) + - [2.4 DB schema](#24-db-schema) + - [2.4.1 Config DB](#241-config-db) + - [2.4.1.1 SSIP table](#2411-ssip-table) + - [2.4.2 Data sample](#242-data-sample) + - [2.4.3 Configuration sample](#243-configuration-sample) + - [2.4.4 Configuration migration](#244-configuration-migration) + - [2.5 Flows](#25-flows) + - [2.5.1 SSIP add](#251-ssip-add) + - [2.5.2 SSIP remove](#252-ssip-remove) + - [2.6 CLI](#26-cli) + - [2.6.1 Command structure](#261-command-structure) + - [2.6.2 Usage examples](#262-usage-examples) + - [2.6.2.1 Config command group](#2621-config-command-group) + - [2.6.2.2 Show command group](#2622-show-command-group) + - [2.7 YANG model](#27-yang-model) + - [2.8 Warm/Fast boot](#28-warmfast-boot) +- [3 Test plan](#3-test-plan) + - [3.1 Unit tests via VS](#31-unit-tests-via-vs) + - [3.2 Data plane tests via PTF](#32-data-plane-tests-via-ptf) + +## Revision + +| Rev | Date | Author | Description | +|:---:|:----------:|:--------------:|:----------------| +| 0.1 | 18/04/2022 | Nazarii Hnydyn | Initial version | + +## About this manual + +This document provides general information about Syslog Source IP implementation in SONiC + +## Scope + +This document describes the high level design of Syslog Source IP feature in SONiC + +**In scope:** +1. Syslog Source IP configuration for UDP protocol + +**Out of scope:** +1. Syslog Source IP configuration for TCP protocol + +## Abbreviations + +| Term | Meaning | +|:------|:------------------------------------------| +| SONiC | Software for Open Networking in the Cloud | +| SSIP | Syslog Source IP | +| IP | Internet Protocol | +| UDP | User Datagram Protocol | +| TCP | Transmission Control Protocol | +| DB | Database | +| VRF | Virtual Routing and Forwarding | +| OMFWD | Syslog Forwarding Output Module | +| CLI | Сommand-line Interface | +| YANG | Yet Another Next Generation | +| VS | Virtual Switch | +| PTF | Packet Test Framework | + +## List of figures + +[Figure 1: SSIP add flow](#figure-1-ssip-add-flow) +[Figure 2: SSIP remove flow](#figure-2-ssip-remove-flow) + +## List of tables + +[Table 1: Event logging](#table-1-event-logging) +[Table 2: Syslog Forwarding Output Module](#table-2-syslog-forwarding-output-module) +[Table 3: SSIP parameters](#table-3-ssip-parameters) + +# 1 Introduction + +## 1.1 Feature overview + +SSIP is a feature which allows user to change UDP packet source IP address. +Any configured address can be used for source IP mangling. +This might be useful for security reasons. + +SSIP also extends the existing syslog implementation with VRF device and server UDP port configuration support. +The feature doesn't change the existing DB schema which makes it fully backward compatible. + +## 1.2 Requirements + +### 1.2.1 Functionality + +**This feature will support the following functionality:** +1. Syslog Source IP address configuration +2. Syslog server UDP port configuration +3. Syslog VRF device support + +### 1.2.2 Command interface + +**This feature will support the following commands:** +1. config: add/delete syslog server configuration +2. show: display syslog server configuration + +### 1.2.3 Error handling + +**This feature will provide error handling for the next situations:** +1. Invalid object reference +2. Invalid options/parameters + +### 1.2.4 Event logging + +**This feature will provide event logging for the next situations:** +1. Syslog server add/delete + +###### Table 1: Event logging + +| Event | Severity | +|:----------------------------------|:---------| +| Syslog server add/delete: success | NOTICE | +| Syslog server add/delete: error | ERROR | + +# 2 Design + +## 2.1 Overview + +SSIP will reuse syslog `omfwd` functionality which offers the next features: +1. Source IP address configuration +2. Server UDP port configuration +3. VRF device configuration + +## 2.2 Syslog Forwarding Output Module + +### 2.2.1 Overview + +###### Table 2: Syslog Forwarding Output Module + +| Parameter | Default | Description | +|:-----------|:---------|:------------------------------------------------------------------------------------------| +| target | none | Name or IP-Address of the system that shall receive messages. Any resolvable name is fine | +| address | none | Bind socket to a given local IP address. This option is only supported for UDP, not TCP | +| port | 514 | Name or numerical value of port to use when connecting to target | +| protocol | udp | Type of protocol to use for forwarding (e.g., tcp/udp) | +| device | none | Bind socket to given device (e.g., eth0/vrf0) | +| ipfreebind | 2 | Manages the IP_FREEBIND option on the UDP socket | + +**MAN page:** [omfwd]( + https://www.rsyslog.com/doc/v8-stable/configuration/modules/omfwd.html#omfwd-syslog-forwarding-output-module + "Syslog Forwarding Output Module" +) + +### 2.2.2 IpFreeBind + +**IP_FREEBIND (since Linux 2.4)** +``` +If enabled, this boolean option allows binding to an IP address that is nonlocal or does not (yet) exist. +This permits listening on a socket, without requiring the underlying network interface +or the specified dynamic IP address to be up at the time that the application is trying to bind to it. +This option is the per-socket equivalent of the ip_nonlocal_bind. +``` + +**MAN page:** [ip_freebind]( + https://linux.die.net/man/7/ip + "IP_FREEBIND" +) + +## 2.3 Configuration agent + +### 2.3.1 Overview + +Configuration management of `rsyslogd` is done by `rsyslog-config` service. +The service is triggered by CLI once data is validated and pushed to Config DB. + +The `rsyslog-config` service performs the next actions: +1. Renders `rsyslog.conf.j2` template with `sonic-cfggen` to generate a new `rsyslogd` config file +2. Restarts `rsyslog` service which triggers `rsyslogd` to load a new config file + +### 2.3.2 SSIP parameters + +**SSIP will have the next parameter mapping:** + +###### Table 3: SSIP parameters + +| SONiC | Rsyslogd | Config DB Schema | +|:-------|:---------|:---------------------------| +| key | target | SYSLOG_SERVER\|key | +| source | address | SYSLOG_SERVER\|key\|source | +| port | port | SYSLOG_SERVER\|key\|port | +| vrf | device | SYSLOG_SERVER\|key\|vrf | + +### 2.3.3 SSIP configuration + +SSIP offers `vrf` and `source` parameters for flexible configuration management. +Each parameter combination requires a dedicated handling approach. + +**Note:** +1. The destination might be not reachable over the specified `vrf`/`source`: no way to check - user's responsibility +2. Additional validation is required when MGMT/DATA VRF is removed while reference still exists in syslog configuration + +#### 2.3.3.1 VRF/Source: `unset/unset` + +Linux kernel decides which source IP to use within the default VRF. + +**Example:** +``` +*.* action(type="omfwd" target="2.2.2.2" protocol="udp") +``` + +#### 2.3.3.2 VRF/Source: `unset/set` + +Check if source IP is configured on any default VRF member: +yes - set source IP, no - generate error + +**Example:** +``` +*.* action(type="omfwd" target="2.2.2.2" protocol="udp" address="1.1.1.1") +``` + +#### 2.3.3.3 VRF/Source: `set/unset` + +Check VRF type: +1. Default +2. MGMT +3. DATA + +Default VRF: +1. Skip VRF configuration + +MGMT VRF: +1. Check if MGMT VRF is enabled: +yes - set VRF, no - generate error + +DATA VRF: +1. Check if VRF is a member of SONiC VRF table: +yes - set VRF, no - generate error + +**Example:** +``` +Default VRF: +*.* action(type="omfwd" target="2.2.2.2" protocol="udp") +MGMT VRF: +*.* action(type="omfwd" target="2.2.2.2" protocol="udp" device="mgmt") +DATA VRF: +*.* action(type="omfwd" target="2.2.2.2" protocol="udp" device="Vrf-Data") +``` + +#### 2.3.3.4 VRF/Source: `set/set` + +Check VRF type: +1. Default +2. MGMT +3. DATA + +Default VRF: +1. Check if source IP is configured on any DEFAULT VRF member: +yes - set source IP, no - generate error +2. Skip VRF configuration + +MGMT VRF: +1. Check if MGMT VRF is enabled: +yes - set VRF, no - generate error +2. Check if source IP is configured on any MGMT VRF member: +yes - set source IP, no - generate error + +DATA VRF: +1. Check if VRF is a member of SONiC VRF table: +yes - set VRF, no - generate error +2. Check if source IP is configured on any DATA VRF member: +yes - set source IP, no - generate error + +**Example:** +``` +Default VRF: +*.* action(type="omfwd" target="2.2.2.2" protocol="udp" address="1.1.1.1") +MGMT VRF: +*.* action(type="omfwd" target="2.2.2.2" protocol="udp" address="1.1.1.1" device="mgmt") +DATA VRF: +*.* action(type="omfwd" target="2.2.2.2" protocol="udp" address="1.1.1.1" device="Vrf-Data") +``` + +## 2.4 DB schema + +### 2.4.1 Config DB + +#### 2.4.1.1 SSIP table +```abnf +; defines schema for syslog table configuration attributes +key = SYSLOG_SERVER|server_ip_address ; server IP address. Must be unique + +; field = value +source = ip-addr ; source IP address +port = 1*5DIGIT ; server UDP port (0..65535) +vrf = vrf-device ; VRF device + +; value annotations +h16 = 1*4HEXDIG +ls32 = h16 ":" h16 +dec-octet = DIGIT ; 0-9 + / %x31-39 DIGIT ; 10-99 + / "1" 2DIGIT ; 100-199 + / "2" %x30-34 DIGIT ; 200-249 + / "25" %x30-35 ; 250-255 +ipv4-addr = dec-octet "." dec-octet "." dec-octet "." dec-octet +ipv6-addr = 6( h16 ":" ) ls32 + / "::" 5( h16 ":" ) ls32 + / [ h16 ] "::" 4( h16 ":" ) ls32 + / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + / [ *4( h16 ":" ) h16 ] "::" ls32 + / [ *5( h16 ":" ) h16 ] "::" h16 + / [ *6( h16 ":" ) h16 ] "::" +ip-addr = ipv4-addr / ipv6-addr +vrf-default = "default" +vrf-mgmt = "mgmt" +vrf-data = "Vrf-" 1*255VCHAR +vrf-device = vrf-default / vrf-mgmt / vrf-data +``` + +### 2.4.2 Data sample + +**Config DB:** +```bash +redis-cli -n 4 HGETALL 'SYSLOG_SERVER|2.2.2.2' +1) "source" +2) "1.1.1.1" +3) "port" +4) "514" +5) "vrf" +6) "default" + +redis-cli -n 4 HGETALL 'SYSLOG_SERVER|3.3.3.3' +1) "source" +2) "1.1.1.1" +3) "port" +4) "514" +5) "vrf" +6) "mgmt" + +redis-cli -n 4 HGETALL 'SYSLOG_SERVER|2222::2222' +1) "source" +2) "1111::1111" +3) "port" +4) "514" +5) "vrf" +6) "Vrf-Data" +``` + +### 2.4.3 Configuration sample + +**Syslog remote logging:** +```json +{ + "SYSLOG_SERVER": { + "2.2.2.2": { + "source": "1.1.1.1", + "port": "514", + "vrf": "default" + }, + "3.3.3.3": { + "source": "1.1.1.1", + "port": "514", + "vrf": "mgmt" + }, + "2222::2222": { + "source": "1111::1111", + "port": "514", + "vrf": "Vrf-Data" + } + } +} +``` + +### 2.4.4 Configuration migration + +No special handling is required + +## 2.5 Flows + +### 2.5.1 SSIP add + +![SSIP add flow](images/ssip_add_flow.svg "Figure 1: SSIP add flow") + +###### Figure 1: SSIP add flow + +### 2.5.2 SSIP remove + +![SSIP remove flow](images/ssip_remove_flow.svg "Figure 2: SSIP remove flow") + +###### Figure 2: SSIP remove flow + +## 2.6 CLI + +### 2.6.1 Command structure + +**User interface**: +``` +config +|--- syslog + |--- add OPTIONS + |--- del + +show +|--- syslog +``` + +**Options:** + +_config syslog add_ +1. `-s|--source` - source ip address +2. `-p|--port` - server udp port +3. `-r|--vrf` - vrf device + +### 2.6.2 Usage examples + +#### 2.6.2.1 Config command group + +**The following command adds/deletes syslog server:** +```bash +config syslog add '2.2.2.2' \ +--source '1.1.1.1' \ +--port '514' \ +--vrf 'default' +config syslog del '2.2.2.2' +``` + +#### 2.6.2.2 Show command group + +**The following command shows syslog server configuration:** +```bash +root@sonic:/home/admin# show syslog +SERVER IP SOURCE IP PORT VRF +----------- ----------- ------ -------- +2.2.2.2 1.1.1.1 514 default +3.3.3.3 1.1.1.1 514 mgmt +2222::2222 1111::1111 514 Vrf-Data +``` + +## 2.7 YANG model + +An existing YANG model `sonic-syslog.yang` will be extended in order to provide support for SSIP. + +**Skeleton code:** +```yang +module sonic-syslog { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-system-syslog"; + prefix syslog; + + import ietf-inet-types { + prefix inet; + } + + import sonic-vrf { + prefix vrf; + } + + description "Syslog YANG Module for SONiC OS: remote syslog logging"; + + revision 2022-04-18 { + description "Initial revision."; + } + + typedef vrf-device { + description "Represents syslog VRF device"; + type enumeration { + enum default; + enum mgmt; + } + } + + container sonic-syslog { + + container SYSLOG_SERVER { + + description "SYSLOG_SERVER part of config_db.json"; + + list SYSLOG_SERVER_LIST { + + key "server_address"; + + leaf server_address { + description "Syslog server IP address"; + type inet:ip-address; + } + + leaf source { + description "Syslog source IP address"; + type inet:ip-address; + } + + leaf port { + description "Syslog server UDP port"; + type inet:port-number; + } + + leaf vrf { + description "Syslog VRF device"; + type union { + type leafref { + path "/vrf:sonic-vrf/vrf:VRF/vrf:VRF_LIST/vrf:name"; + } + type vrf-device; + } + } + + } + /* end of list SYSLOG_SERVER_LIST */ + } + /* end of container SYSLOG_SERVER */ + } + /* end of container sonic-syslog */ +} +/* end of module sonic-syslog */ +``` + +## 2.8 Warm/Fast boot + +No special handling is required + +# 3 Test plan + +## 3.1 Unit tests via VS + +SSIP basic configuration test: +1. Verify rsyslog.conf after syslog server creation/removal + +SSIP extended configuration test: +1. Create syslog server with IPv4/IPv6 source IP +2. Verify rsyslog.conf +3. Create syslog server with default/mgmt/data VRF device +4. Verify rsyslog.conf + +## 3.2 Data plane tests via PTF + +TBD From 920666eb93e67ea3935b32b5225b09c0a7582856 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Sun, 19 Jun 2022 13:54:33 +0300 Subject: [PATCH 38/60] [sonic-bootchart] add document on integrating systemd-bootchart (#1001) Signed-off-by: Stepan Blyschak --- doc/profiling/img/bootchart.svg | 56808 +++++++++++++++++++++++++++++ doc/profiling/sonic_bootchart.md | 231 + 2 files changed, 57039 insertions(+) create mode 100755 doc/profiling/img/bootchart.svg create mode 100755 doc/profiling/sonic_bootchart.md diff --git a/doc/profiling/img/bootchart.svg b/doc/profiling/img/bootchart.svg new file mode 100755 index 0000000000..d49029549b --- /dev/null +++ b/doc/profiling/img/bootchart.svg @@ -0,0 +1,56808 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +IO utilization - read + + + 0.0s + + + + + + + + + + + 1.0s + + + + + + + + + + + 2.0s + + + + + + + + + + + 3.0s + + + + + + + + + + + 4.0s + + + + + + + + + + + 5.0s + + + + + + + + + + + 6.0s + + + + + + + + + + + 7.0s + + + + + + + + + + + 8.0s + + + + + + + + + + + 9.0s + + + + + + + + + + + 10.0s + + + + + + + + + + + 11.0s + + + + + + + + + + + 12.0s + + + + + + + + + + + 13.0s + + + + + + + + + + + 14.0s + + + + + + + + + + + 15.0s + + + + + + + + + + + 16.0s + + + + + + + + + + + 17.0s + + + + + + + + + + + 18.0s + + + + + + + + + + + 19.0s + + + + + + + + + + + 20.0s + + + + + + + + + + + 21.0s + + + + + + + + + + + 22.0s + + + + + + + + + + + 23.0s + + + + + + + + + + + 24.0s + + + + + + + + + + + 25.0s + + + + + + + + + + + 26.0s + + + + + + + + + + + 27.0s + + + + + + + + + + + 28.0s + + + + + + + + + + + 29.0s + + + + + + + + + + + 30.0s + + + + + + + + + + + 31.0s + + + + + + + + + + + 32.0s + + + + + + + + + + + 33.0s + + + + + + + + + + + 34.0s + + + + + + + + + + + 35.0s + + + + + + + + + + + 36.0s + + + + + + + + + + + 37.0s + + + + + + + + + + + 38.0s + + + + + + + + + + + 39.0s + + + + + + + + + + + 40.0s + + + + + + + + + + + 41.0s + + + + + + + + + + + 42.0s + + + + + + + + + + + 43.0s + + + + + + + + + + + 44.0s + + + + + + + + + + + 45.0s + + + + + + + + + + + 46.0s + + + + + + + + + + + 47.0s + + + + + + + + + + + 48.0s + + + + + + + + + + + 49.0s + + + + + + + + + + + 50.0s + + + + + + + + + + + 51.0s + + + + + + + + + + + 52.0s + + + + + + + + + + + 53.0s + + + + + + + + + + + 54.0s + + + + + + + + + + + 55.0s + + + + + + + + + + + 56.0s + + + + + + + + + + + 57.0s + + + + + + + + + + + 58.0s + + + + + + + + + + + 59.0s + + + + + + + + + + + 60.0s + + + + + + + + + + + 61.0s + + + + + + + + + + + 62.0s + + + + + + + + + + + 63.0s + + + + + + + + + + + 64.0s + + + + + + + + + + + 65.0s + + + + + + + + + + + 66.0s + + + + + + + + + + + 67.0s + + + + + + + + + + + 68.0s + + + + + + + + + + + 69.0s + + + + + + + + + + + 70.0s + + + + + + + + + + + 71.0s + + + + + + + + + + + 72.0s + + + + + + + + + + + 73.0s + + + + + + + + + + + 74.0s + + + + + + + + + + + 75.0s + + + + + + + + + + + 76.0s + + + + + + + + + + + 77.0s + + + + + + + + + + + 78.0s + + + + + + + + + + + 79.0s + + + + + + + + + + + 80.0s + + + + + + + + + + + 81.0s + + + + + + + + + + + 82.0s + + + + + + + + + + + 83.0s + + + + + + + + + + + 84.0s + + + + + + + + + + + 85.0s + + + + + + + + + + + 86.0s + + + + + + + + + + + 87.0s + + + + + + + + + + + 88.0s + + + + + + + + + + + 89.0s + + + + + + + + + + + 90.0s + + + + + + + + + + + 91.0s + + + + + + + + + + + 92.0s + + + + + + + + + + + 93.0s + + + + + + + + + + + 94.0s + + + + + + + + + + + 95.0s + + + + + + + + + + + 96.0s + + + + + + + + + + + 97.0s + + + + + + + + + + + 98.0s + + + + + + + + + + + 99.0s + + + + + + + + + + + 100.0s + + + + + + + + + + + 101.0s + + + + + + + + + + + 102.0s + + + + + + + + + + + 103.0s + + + + + + + + + + + 104.0s + + + + + + + + + + + 105.0s + + + + + + + + + + + 106.0s + + + + + + + + + + + 107.0s + + + + + + + + + + + 108.0s + + + + + + + + + + + 109.0s + + + + + + + + + + + 110.0s + + + + + + + + + + + 111.0s + + + + + + + + + + + 112.0s + + + + + + + + + + + 113.0s + + + + + + + + + + + 114.0s + + + + + + + + + + + 115.0s + + + + + + + + + + + 116.0s + + + + + + + + + + + 117.0s + + + + + + + + + + + 118.0s + + + + + + + + + + + 119.0s + + + + + + + + + + + 120.0s + + + + + + + + + + + 121.0s + + + + + + + + + + + 122.0s + + + + + + + + + + + 123.0s + + + + + + + + + + + 124.0s + + + + + + + + + + + 125.0s + + + + + + + + + + + 126.0s + + + + + + + + + + + 127.0s + + + + + + + + + + + 128.0s + + + + + + + + + + + 129.0s + + + + + + + + + + + 130.0s + + + + + + + + + + + 131.0s + + + + + + + + + + + 132.0s + + + + + + + + + + + 133.0s + + + + + + + + + + + 134.0s + + + + + + + + + + + 135.0s + + + + + + + + + + + 136.0s + + + + + + + + + + + 137.0s + + + + + + + + + + + 138.0s + + + + + + + + + + + 139.0s + + + + + + + + + + + 140.0s + + + + + + + + + + + 141.0s + + + + + + + + + + + 142.0s + + + + + + + + + + + 143.0s + + + + + + + + + + + 144.0s + + + + + + + + + + + 145.0s + + + + + + + + + + + 146.0s + + + + + + + + + + + 147.0s + + + + + + + + + + + 148.0s + + + + + + + + + + + 149.0s + + + + + + + + + + + 150.0s + + + + + + + + + + + 151.0s + + + + + + + + + + + 152.0s + + + + + + + + + + + 153.0s + + + + + + + + + + + 154.0s + + + + + + + + + + + 155.0s + + + + + + + + + + + 156.0s + + + + + + + + + + + 157.0s + + + + + + + + + + + 158.0s + + + + + + + + + + + 159.0s + + + + + + + + + + + 160.0s + + + + + + + + + + + 161.0s + + + + + + + + + + + 162.0s + + + + + + + + + + + 163.0s + + + + + + + + + + + 164.0s + + + + + + + + + + + 165.0s + + + + + + + + + + + 166.0s + + + + + + + + + + + 167.0s + + + + + + + + + + + 168.0s + + + + + + + + + + + 169.0s + + + + + + + + + + + 170.0s + + + + + + + + + + + 171.0s + + + + + + + + + + + 172.0s + + + + + + + + + + + 173.0s + + + + + + + + + + + 174.0s + + + + + + + + + + + 175.0s + + + + + + + + + + + 176.0s + + + + + + + + + + + 177.0s + + + + + + + + + + + 178.0s + + + + + + + + + + + 179.0s + + + + + + + + + + + 180.0s + + + + + 333.47mb/sec + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +IO utilization - write + + + 0.0s + + + + + + + + + + + 1.0s + + + + + + + + + + + 2.0s + + + + + + + + + + + 3.0s + + + + + + + + + + + 4.0s + + + + + + + + + + + 5.0s + + + + + + + + + + + 6.0s + + + + + + + + + + + 7.0s + + + + + + + + + + + 8.0s + + + + + + + + + + + 9.0s + + + + + + + + + + + 10.0s + + + + + + + + + + + 11.0s + + + + + + + + + + + 12.0s + + + + + + + + + + + 13.0s + + + + + + + + + + + 14.0s + + + + + + + + + + + 15.0s + + + + + + + + + + + 16.0s + + + + + + + + + + + 17.0s + + + + + + + + + + + 18.0s + + + + + + + + + + + 19.0s + + + + + + + + + + + 20.0s + + + + + + + + + + + 21.0s + + + + + + + + + + + 22.0s + + + + + + + + + + + 23.0s + + + + + + + + + + + 24.0s + + + + + + + + + + + 25.0s + + + + + + + + + + + 26.0s + + + + + + + + + + + 27.0s + + + + + + + + + + + 28.0s + + + + + + + + + + + 29.0s + + + + + + + + + + + 30.0s + + + + + + + + + + + 31.0s + + + + + + + + + + + 32.0s + + + + + + + + + + + 33.0s + + + + + + + + + + + 34.0s + + + + + + + + + + + 35.0s + + + + + + + + + + + 36.0s + + + + + + + + + + + 37.0s + + + + + + + + + + + 38.0s + + + + + + + + + + + 39.0s + + + + + + + + + + + 40.0s + + + + + + + + + + + 41.0s + + + + + + + + + + + 42.0s + + + + + + + + + + + 43.0s + + + + + + + + + + + 44.0s + + + + + + + + + + + 45.0s + + + + + + + + + + + 46.0s + + + + + + + + + + + 47.0s + + + + + + + + + + + 48.0s + + + + + + + + + + + 49.0s + + + + + + + + + + + 50.0s + + + + + + + + + + + 51.0s + + + + + + + + + + + 52.0s + + + + + + + + + + + 53.0s + + + + + + + + + + + 54.0s + + + + + + + + + + + 55.0s + + + + + + + + + + + 56.0s + + + + + + + + + + + 57.0s + + + + + + + + + + + 58.0s + + + + + + + + + + + 59.0s + + + + + + + + + + + 60.0s + + + + + + + + + + + 61.0s + + + + + + + + + + + 62.0s + + + + + + + + + + + 63.0s + + + + + + + + + + + 64.0s + + + + + + + + + + + 65.0s + + + + + + + + + + + 66.0s + + + + + + + + + + + 67.0s + + + + + + + + + + + 68.0s + + + + + + + + + + + 69.0s + + + + + + + + + + + 70.0s + + + + + + + + + + + 71.0s + + + + + + + + + + + 72.0s + + + + + + + + + + + 73.0s + + + + + + + + + + + 74.0s + + + + + + + + + + + 75.0s + + + + + + + + + + + 76.0s + + + + + + + + + + + 77.0s + + + + + + + + + + + 78.0s + + + + + + + + + + + 79.0s + + + + + + + + + + + 80.0s + + + + + + + + + + + 81.0s + + + + + + + + + + + 82.0s + + + + + + + + + + + 83.0s + + + + + + + + + + + 84.0s + + + + + + + + + + + 85.0s + + + + + + + + + + + 86.0s + + + + + + + + + + + 87.0s + + + + + + + + + + + 88.0s + + + + + + + + + + + 89.0s + + + + + + + + + + + 90.0s + + + + + + + + + + + 91.0s + + + + + + + + + + + 92.0s + + + + + + + + + + + 93.0s + + + + + + + + + + + 94.0s + + + + + + + + + + + 95.0s + + + + + + + + + + + 96.0s + + + + + + + + + + + 97.0s + + + + + + + + + + + 98.0s + + + + + + + + + + + 99.0s + + + + + + + + + + + 100.0s + + + + + + + + + + + 101.0s + + + + + + + + + + + 102.0s + + + + + + + + + + + 103.0s + + + + + + + + + + + 104.0s + + + + + + + + + + + 105.0s + + + + + + + + + + + 106.0s + + + + + + + + + + + 107.0s + + + + + + + + + + + 108.0s + + + + + + + + + + + 109.0s + + + + + + + + + + + 110.0s + + + + + + + + + + + 111.0s + + + + + + + + + + + 112.0s + + + + + + + + + + + 113.0s + + + + + + + + + + + 114.0s + + + + + + + + + + + 115.0s + + + + + + + + + + + 116.0s + + + + + + + + + + + 117.0s + + + + + + + + + + + 118.0s + + + + + + + + + + + 119.0s + + + + + + + + + + + 120.0s + + + + + + + + + + + 121.0s + + + + + + + + + + + 122.0s + + + + + + + + + + + 123.0s + + + + + + + + + + + 124.0s + + + + + + + + + + + 125.0s + + + + + + + + + + + 126.0s + + + + + + + + + + + 127.0s + + + + + + + + + + + 128.0s + + + + + + + + + + + 129.0s + + + + + + + + + + + 130.0s + + + + + + + + + + + 131.0s + + + + + + + + + + + 132.0s + + + + + + + + + + + 133.0s + + + + + + + + + + + 134.0s + + + + + + + + + + + 135.0s + + + + + + + + + + + 136.0s + + + + + + + + + + + 137.0s + + + + + + + + + + + 138.0s + + + + + + + + + + + 139.0s + + + + + + + + + + + 140.0s + + + + + + + + + + + 141.0s + + + + + + + + + + + 142.0s + + + + + + + + + + + 143.0s + + + + + + + + + + + 144.0s + + + + + + + + + + + 145.0s + + + + + + + + + + + 146.0s + + + + + + + + + + + 147.0s + + + + + + + + + + + 148.0s + + + + + + + + + + + 149.0s + + + + + + + + + + + 150.0s + + + + + + + + + + + 151.0s + + + + + + + + + + + 152.0s + + + + + + + + + + + 153.0s + + + + + + + + + + + 154.0s + + + + + + + + + + + 155.0s + + + + + + + + + + + 156.0s + + + + + + + + + + + 157.0s + + + + + + + + + + + 158.0s + + + + + + + + + + + 159.0s + + + + + + + + + + + 160.0s + + + + + + + + + + + 161.0s + + + + + + + + + + + 162.0s + + + + + + + + + + + 163.0s + + + + + + + + + + + 164.0s + + + + + + + + + + + 165.0s + + + + + + + + + + + 166.0s + + + + + + + + + + + 167.0s + + + + + + + + + + + 168.0s + + + + + + + + + + + 169.0s + + + + + + + + + + + 170.0s + + + + + + + + + + + 171.0s + + + + + + + + + + + 172.0s + + + + + + + + + + + 173.0s + + + + + + + + + + + 174.0s + + + + + + + + + + + 175.0s + + + + + + + + + + + 176.0s + + + + + + + + + + + 177.0s + + + + + + + + + + + 178.0s + + + + + + + + + + + 179.0s + + + + + + + + + + + 180.0s + + + + + + + + + + + + + + + + + + + + + + + + + 23.60mb/sec + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CPU[overall] utilization + + + 0.0s + + + + + + + + + + + 1.0s + + + + + + + + + + + 2.0s + + + + + + + + + + + 3.0s + + + + + + + + + + + 4.0s + + + + + + + + + + + 5.0s + + + + + + + + + + + 6.0s + + + + + + + + + + + 7.0s + + + + + + + + + + + 8.0s + + + + + + + + + + + 9.0s + + + + + + + + + + + 10.0s + + + + + + + + + + + 11.0s + + + + + + + + + + + 12.0s + + + + + + + + + + + 13.0s + + + + + + + + + + + 14.0s + + + + + + + + + + + 15.0s + + + + + + + + + + + 16.0s + + + + + + + + + + + 17.0s + + + + + + + + + + + 18.0s + + + + + + + + + + + 19.0s + + + + + + + + + + + 20.0s + + + + + + + + + + + 21.0s + + + + + + + + + + + 22.0s + + + + + + + + + + + 23.0s + + + + + + + + + + + 24.0s + + + + + + + + + + + 25.0s + + + + + + + + + + + 26.0s + + + + + + + + + + + 27.0s + + + + + + + + + + + 28.0s + + + + + + + + + + + 29.0s + + + + + + + + + + + 30.0s + + + + + + + + + + + 31.0s + + + + + + + + + + + 32.0s + + + + + + + + + + + 33.0s + + + + + + + + + + + 34.0s + + + + + + + + + + + 35.0s + + + + + + + + + + + 36.0s + + + + + + + + + + + 37.0s + + + + + + + + + + + 38.0s + + + + + + + + + + + 39.0s + + + + + + + + + + + 40.0s + + + + + + + + + + + 41.0s + + + + + + + + + + + 42.0s + + + + + + + + + + + 43.0s + + + + + + + + + + + 44.0s + + + + + + + + + + + 45.0s + + + + + + + + + + + 46.0s + + + + + + + + + + + 47.0s + + + + + + + + + + + 48.0s + + + + + + + + + + + 49.0s + + + + + + + + + + + 50.0s + + + + + + + + + + + 51.0s + + + + + + + + + + + 52.0s + + + + + + + + + + + 53.0s + + + + + + + + + + + 54.0s + + + + + + + + + + + 55.0s + + + + + + + + + + + 56.0s + + + + + + + + + + + 57.0s + + + + + + + + + + + 58.0s + + + + + + + + + + + 59.0s + + + + + + + + + + + 60.0s + + + + + + + + + + + 61.0s + + + + + + + + + + + 62.0s + + + + + + + + + + + 63.0s + + + + + + + + + + + 64.0s + + + + + + + + + + + 65.0s + + + + + + + + + + + 66.0s + + + + + + + + + + + 67.0s + + + + + + + + + + + 68.0s + + + + + + + + + + + 69.0s + + + + + + + + + + + 70.0s + + + + + + + + + + + 71.0s + + + + + + + + + + + 72.0s + + + + + + + + + + + 73.0s + + + + + + + + + + + 74.0s + + + + + + + + + + + 75.0s + + + + + + + + + + + 76.0s + + + + + + + + + + + 77.0s + + + + + + + + + + + 78.0s + + + + + + + + + + + 79.0s + + + + + + + + + + + 80.0s + + + + + + + + + + + 81.0s + + + + + + + + + + + 82.0s + + + + + + + + + + + 83.0s + + + + + + + + + + + 84.0s + + + + + + + + + + + 85.0s + + + + + + + + + + + 86.0s + + + + + + + + + + + 87.0s + + + + + + + + + + + 88.0s + + + + + + + + + + + 89.0s + + + + + + + + + + + 90.0s + + + + + + + + + + + 91.0s + + + + + + + + + + + 92.0s + + + + + + + + + + + 93.0s + + + + + + + + + + + 94.0s + + + + + + + + + + + 95.0s + + + + + + + + + + + 96.0s + + + + + + + + + + + 97.0s + + + + + + + + + + + 98.0s + + + + + + + + + + + 99.0s + + + + + + + + + + + 100.0s + + + + + + + + + + + 101.0s + + + + + + + + + + + 102.0s + + + + + + + + + + + 103.0s + + + + + + + + + + + 104.0s + + + + + + + + + + + 105.0s + + + + + + + + + + + 106.0s + + + + + + + + + + + 107.0s + + + + + + + + + + + 108.0s + + + + + + + + + + + 109.0s + + + + + + + + + + + 110.0s + + + + + + + + + + + 111.0s + + + + + + + + + + + 112.0s + + + + + + + + + + + 113.0s + + + + + + + + + + + 114.0s + + + + + + + + + + + 115.0s + + + + + + + + + + + 116.0s + + + + + + + + + + + 117.0s + + + + + + + + + + + 118.0s + + + + + + + + + + + 119.0s + + + + + + + + + + + 120.0s + + + + + + + + + + + 121.0s + + + + + + + + + + + 122.0s + + + + + + + + + + + 123.0s + + + + + + + + + + + 124.0s + + + + + + + + + + + 125.0s + + + + + + + + + + + 126.0s + + + + + + + + + + + 127.0s + + + + + + + + + + + 128.0s + + + + + + + + + + + 129.0s + + + + + + + + + + + 130.0s + + + + + + + + + + + 131.0s + + + + + + + + + + + 132.0s + + + + + + + + + + + 133.0s + + + + + + + + + + + 134.0s + + + + + + + + + + + 135.0s + + + + + + + + + + + 136.0s + + + + + + + + + + + 137.0s + + + + + + + + + + + 138.0s + + + + + + + + + + + 139.0s + + + + + + + + + + + 140.0s + + + + + + + + + + + 141.0s + + + + + + + + + + + 142.0s + + + + + + + + + + + 143.0s + + + + + + + + + + + 144.0s + + + + + + + + + + + 145.0s + + + + + + + + + + + 146.0s + + + + + + + + + + + 147.0s + + + + + + + + + + + 148.0s + + + + + + + + + + + 149.0s + + + + + + + + + + + 150.0s + + + + + + + + + + + 151.0s + + + + + + + + + + + 152.0s + + + + + + + + + + + 153.0s + + + + + + + + + + + 154.0s + + + + + + + + + + + 155.0s + + + + + + + + + + + 156.0s + + + + + + + + + + + 157.0s + + + + + + + + + + + 158.0s + + + + + + + + + + + 159.0s + + + + + + + + + + + 160.0s + + + + + + + + + + + 161.0s + + + + + + + + + + + 162.0s + + + + + + + + + + + 163.0s + + + + + + + + + + + 164.0s + + + + + + + + + + + 165.0s + + + + + + + + + + + 166.0s + + + + + + + + + + + 167.0s + + + + + + + + + + + 168.0s + + + + + + + + + + + 169.0s + + + + + + + + + + + 170.0s + + + + + + + + + + + 171.0s + + + + + + + + + + + 172.0s + + + + + + + + + + + 173.0s + + + + + + + + + + + 174.0s + + + + + + + + + + + 175.0s + + + + + + + + + + + 176.0s + + + + + + + + + + + 177.0s + + + + + + + + + + + 178.0s + + + + + + + + + + + 179.0s + + + + + + + + + + + 180.0s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CPU[overall] wait + + + 0.0s + + + + + + + + + + + 1.0s + + + + + + + + + + + 2.0s + + + + + + + + + + + 3.0s + + + + + + + + + + + 4.0s + + + + + + + + + + + 5.0s + + + + + + + + + + + 6.0s + + + + + + + + + + + 7.0s + + + + + + + + + + + 8.0s + + + + + + + + + + + 9.0s + + + + + + + + + + + 10.0s + + + + + + + + + + + 11.0s + + + + + + + + + + + 12.0s + + + + + + + + + + + 13.0s + + + + + + + + + + + 14.0s + + + + + + + + + + + 15.0s + + + + + + + + + + + 16.0s + + + + + + + + + + + 17.0s + + + + + + + + + + + 18.0s + + + + + + + + + + + 19.0s + + + + + + + + + + + 20.0s + + + + + + + + + + + 21.0s + + + + + + + + + + + 22.0s + + + + + + + + + + + 23.0s + + + + + + + + + + + 24.0s + + + + + + + + + + + 25.0s + + + + + + + + + + + 26.0s + + + + + + + + + + + 27.0s + + + + + + + + + + + 28.0s + + + + + + + + + + + 29.0s + + + + + + + + + + + 30.0s + + + + + + + + + + + 31.0s + + + + + + + + + + + 32.0s + + + + + + + + + + + 33.0s + + + + + + + + + + + 34.0s + + + + + + + + + + + 35.0s + + + + + + + + + + + 36.0s + + + + + + + + + + + 37.0s + + + + + + + + + + + 38.0s + + + + + + + + + + + 39.0s + + + + + + + + + + + 40.0s + + + + + + + + + + + 41.0s + + + + + + + + + + + 42.0s + + + + + + + + + + + 43.0s + + + + + + + + + + + 44.0s + + + + + + + + + + + 45.0s + + + + + + + + + + + 46.0s + + + + + + + + + + + 47.0s + + + + + + + + + + + 48.0s + + + + + + + + + + + 49.0s + + + + + + + + + + + 50.0s + + + + + + + + + + + 51.0s + + + + + + + + + + + 52.0s + + + + + + + + + + + 53.0s + + + + + + + + + + + 54.0s + + + + + + + + + + + 55.0s + + + + + + + + + + + 56.0s + + + + + + + + + + + 57.0s + + + + + + + + + + + 58.0s + + + + + + + + + + + 59.0s + + + + + + + + + + + 60.0s + + + + + + + + + + + 61.0s + + + + + + + + + + + 62.0s + + + + + + + + + + + 63.0s + + + + + + + + + + + 64.0s + + + + + + + + + + + 65.0s + + + + + + + + + + + 66.0s + + + + + + + + + + + 67.0s + + + + + + + + + + + 68.0s + + + + + + + + + + + 69.0s + + + + + + + + + + + 70.0s + + + + + + + + + + + 71.0s + + + + + + + + + + + 72.0s + + + + + + + + + + + 73.0s + + + + + + + + + + + 74.0s + + + + + + + + + + + 75.0s + + + + + + + + + + + 76.0s + + + + + + + + + + + 77.0s + + + + + + + + + + + 78.0s + + + + + + + + + + + 79.0s + + + + + + + + + + + 80.0s + + + + + + + + + + + 81.0s + + + + + + + + + + + 82.0s + + + + + + + + + + + 83.0s + + + + + + + + + + + 84.0s + + + + + + + + + + + 85.0s + + + + + + + + + + + 86.0s + + + + + + + + + + + 87.0s + + + + + + + + + + + 88.0s + + + + + + + + + + + 89.0s + + + + + + + + + + + 90.0s + + + + + + + + + + + 91.0s + + + + + + + + + + + 92.0s + + + + + + + + + + + 93.0s + + + + + + + + + + + 94.0s + + + + + + + + + + + 95.0s + + + + + + + + + + + 96.0s + + + + + + + + + + + 97.0s + + + + + + + + + + + 98.0s + + + + + + + + + + + 99.0s + + + + + + + + + + + 100.0s + + + + + + + + + + + 101.0s + + + + + + + + + + + 102.0s + + + + + + + + + + + 103.0s + + + + + + + + + + + 104.0s + + + + + + + + + + + 105.0s + + + + + + + + + + + 106.0s + + + + + + + + + + + 107.0s + + + + + + + + + + + 108.0s + + + + + + + + + + + 109.0s + + + + + + + + + + + 110.0s + + + + + + + + + + + 111.0s + + + + + + + + + + + 112.0s + + + + + + + + + + + 113.0s + + + + + + + + + + + 114.0s + + + + + + + + + + + 115.0s + + + + + + + + + + + 116.0s + + + + + + + + + + + 117.0s + + + + + + + + + + + 118.0s + + + + + + + + + + + 119.0s + + + + + + + + + + + 120.0s + + + + + + + + + + + 121.0s + + + + + + + + + + + 122.0s + + + + + + + + + + + 123.0s + + + + + + + + + + + 124.0s + + + + + + + + + + + 125.0s + + + + + + + + + + + 126.0s + + + + + + + + + + + 127.0s + + + + + + + + + + + 128.0s + + + + + + + + + + + 129.0s + + + + + + + + + + + 130.0s + + + + + + + + + + + 131.0s + + + + + + + + + + + 132.0s + + + + + + + + + + + 133.0s + + + + + + + + + + + 134.0s + + + + + + + + + + + 135.0s + + + + + + + + + + + 136.0s + + + + + + + + + + + 137.0s + + + + + + + + + + + 138.0s + + + + + + + + + + + 139.0s + + + + + + + + + + + 140.0s + + + + + + + + + + + 141.0s + + + + + + + + + + + 142.0s + + + + + + + + + + + 143.0s + + + + + + + + + + + 144.0s + + + + + + + + + + + 145.0s + + + + + + + + + + + 146.0s + + + + + + + + + + + 147.0s + + + + + + + + + + + 148.0s + + + + + + + + + + + 149.0s + + + + + + + + + + + 150.0s + + + + + + + + + + + 151.0s + + + + + + + + + + + 152.0s + + + + + + + + + + + 153.0s + + + + + + + + + + + 154.0s + + + + + + + + + + + 155.0s + + + + + + + + + + + 156.0s + + + + + + + + + + + 157.0s + + + + + + + + + + + 158.0s + + + + + + + + + + + 159.0s + + + + + + + + + + + 160.0s + + + + + + + + + + + 161.0s + + + + + + + + + + + 162.0s + + + + + + + + + + + 163.0s + + + + + + + + + + + 164.0s + + + + + + + + + + + 165.0s + + + + + + + + + + + 166.0s + + + + + + + + + + + 167.0s + + + + + + + + + + + 168.0s + + + + + + + + + + + 169.0s + + + + + + + + + + + 170.0s + + + + + + + + + + + 171.0s + + + + + + + + + + + 172.0s + + + + + + + + + + + 173.0s + + + + + + + + + + + 174.0s + + + + + + + + + + + 175.0s + + + + + + + + + + + 176.0s + + + + + + + + + + + 177.0s + + + + + + + + + + + 178.0s + + + + + + + + + + + 179.0s + + + + + + + + + + + 180.0s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Processes + + + 0.0s + + + + + + + + + + + 1.0s + + + + + + + + + + + 2.0s + + + + + + + + + + + 3.0s + + + + + + + + + + + 4.0s + + + + + + + + + + + 5.0s + + + + + + + + + + + 6.0s + + + + + + + + + + + 7.0s + + + + + + + + + + + 8.0s + + + + + + + + + + + 9.0s + + + + + + + + + + + 10.0s + + + + + + + + + + + 11.0s + + + + + + + + + + + 12.0s + + + + + + + + + + + 13.0s + + + + + + + + + + + 14.0s + + + + + + + + + + + 15.0s + + + + + + + + + + + 16.0s + + + + + + + + + + + 17.0s + + + + + + + + + + + 18.0s + + + + + + + + + + + 19.0s + + + + + + + + + + + 20.0s + + + + + + + + + + + 21.0s + + + + + + + + + + + 22.0s + + + + + + + + + + + 23.0s + + + + + + + + + + + 24.0s + + + + + + + + + + + 25.0s + + + + + + + + + + + 26.0s + + + + + + + + + + + 27.0s + + + + + + + + + + + 28.0s + + + + + + + + + + + 29.0s + + + + + + + + + + + 30.0s + + + + + + + + + + + 31.0s + + + + + + + + + + + 32.0s + + + + + + + + + + + 33.0s + + + + + + + + + + + 34.0s + + + + + + + + + + + 35.0s + + + + + + + + + + + 36.0s + + + + + + + + + + + 37.0s + + + + + + + + + + + 38.0s + + + + + + + + + + + 39.0s + + + + + + + + + + + 40.0s + + + + + + + + + + + 41.0s + + + + + + + + + + + 42.0s + + + + + + + + + + + 43.0s + + + + + + + + + + + 44.0s + + + + + + + + + + + 45.0s + + + + + + + + + + + 46.0s + + + + + + + + + + + 47.0s + + + + + + + + + + + 48.0s + + + + + + + + + + + 49.0s + + + + + + + + + + + 50.0s + + + + + + + + + + + 51.0s + + + + + + + + + + + 52.0s + + + + + + + + + + + 53.0s + + + + + + + + + + + 54.0s + + + + + + + + + + + 55.0s + + + + + + + + + + + 56.0s + + + + + + + + + + + 57.0s + + + + + + + + + + + 58.0s + + + + + + + + + + + 59.0s + + + + + + + + + + + 60.0s + + + + + + + + + + + 61.0s + + + + + + + + + + + 62.0s + + + + + + + + + + + 63.0s + + + + + + + + + + + 64.0s + + + + + + + + + + + 65.0s + + + + + + + + + + + 66.0s + + + + + + + + + + + 67.0s + + + + + + + + + + + 68.0s + + + + + + + + + + + 69.0s + + + + + + + + + + + 70.0s + + + + + + + + + + + 71.0s + + + + + + + + + + + 72.0s + + + + + + + + + + + 73.0s + + + + + + + + + + + 74.0s + + + + + + + + + + + 75.0s + + + + + + + + + + + 76.0s + + + + + + + + + + + 77.0s + + + + + + + + + + + 78.0s + + + + + + + + + + + 79.0s + + + + + + + + + + + 80.0s + + + + + + + + + + + 81.0s + + + + + + + + + + + 82.0s + + + + + + + + + + + 83.0s + + + + + + + + + + + 84.0s + + + + + + + + + + + 85.0s + + + + + + + + + + + 86.0s + + + + + + + + + + + 87.0s + + + + + + + + + + + 88.0s + + + + + + + + + + + 89.0s + + + + + + + + + + + 90.0s + + + + + + + + + + + 91.0s + + + + + + + + + + + 92.0s + + + + + + + + + + + 93.0s + + + + + + + + + + + 94.0s + + + + + + + + + + + 95.0s + + + + + + + + + + + 96.0s + + + + + + + + + + + 97.0s + + + + + + + + + + + 98.0s + + + + + + + + + + + 99.0s + + + + + + + + + + + 100.0s + + + + + + + + + + + 101.0s + + + + + + + + + + + 102.0s + + + + + + + + + + + 103.0s + + + + + + + + + + + 104.0s + + + + + + + + + + + 105.0s + + + + + + + + + + + 106.0s + + + + + + + + + + + 107.0s + + + + + + + + + + + 108.0s + + + + + + + + + + + 109.0s + + + + + + + + + + + 110.0s + + + + + + + + + + + 111.0s + + + + + + + + + + + 112.0s + + + + + + + + + + + 113.0s + + + + + + + + + + + 114.0s + + + + + + + + + + + 115.0s + + + + + + + + + + + 116.0s + + + + + + + + + + + 117.0s + + + + + + + + + + + 118.0s + + + + + + + + + + + 119.0s + + + + + + + + + + + 120.0s + + + + + + + + + + + 121.0s + + + + + + + + + + + 122.0s + + + + + + + + + + + 123.0s + + + + + + + + + + + 124.0s + + + + + + + + + + + 125.0s + + + + + + + + + + + 126.0s + + + + + + + + + + + 127.0s + + + + + + + + + + + 128.0s + + + + + + + + + + + 129.0s + + + + + + + + + + + 130.0s + + + + + + + + + + + 131.0s + + + + + + + + + + + 132.0s + + + + + + + + + + + 133.0s + + + + + + + + + + + 134.0s + + + + + + + + + + + 135.0s + + + + + + + + + + + 136.0s + + + + + + + + + + + 137.0s + + + + + + + + + + + 138.0s + + + + + + + + + + + 139.0s + + + + + + + + + + + 140.0s + + + + + + + + + + + 141.0s + + + + + + + + + + + 142.0s + + + + + + + + + + + 143.0s + + + + + + + + + + + 144.0s + + + + + + + + + + + 145.0s + + + + + + + + + + + 146.0s + + + + + + + + + + + 147.0s + + + + + + + + + + + 148.0s + + + + + + + + + + + 149.0s + + + + + + + + + + + 150.0s + + + + + + + + + + + 151.0s + + + + + + + + + + + 152.0s + + + + + + + + + + + 153.0s + + + + + + + + + + + 154.0s + + + + + + + + + + + 155.0s + + + + + + + + + + + 156.0s + + + + + + + + + + + 157.0s + + + + + + + + + + + 158.0s + + + + + + + + + + + 159.0s + + + + + + + + + + + 160.0s + + + + + + + + + + + 161.0s + + + + + + + + + + + 162.0s + + + + + + + + + + + 163.0s + + + + + + + + + + + 164.0s + + + + + + + + + + + 165.0s + + + + + + + + + + + 166.0s + + + + + + + + + + + 167.0s + + + + + + + + + + + 168.0s + + + + + + + + + + + 169.0s + + + + + + + + + + + 170.0s + + + + + + + + + + + 171.0s + + + + + + + + + + + 172.0s + + + + + + + + + + + 173.0s + + + + + + + + + + + 174.0s + + + + + + + + + + + 175.0s + + + + + + + + + + + 176.0s + + + + + + + + + + + 177.0s + + + + + + + + + + + 178.0s + + + + + + + + + + + 179.0s + + + + + + + + + + + 180.0s + + + + + + + + + kthreadd [2]3.5ms + + + + + + + + + + + + + + + + + + + + + + + kworker/0:0 [5]132.0ms + + + + + + + + kworker/0:1 [7]3.4ms + + + + + + + kworker/u16:0 [8]31.9ms + + + + + + + + + + + + + + + + + + ksoftirqd/0 [12]91.1ms + + + + + + + + + + + + + + + + + rcu_sched [13]262.8ms + + + + + + + migration/0 [14]6.8ms + + + + + + + cpuhp/0 [15]1.6ms + + + + + + + + migration/1 [17]86.9ms + + + + + + + + + + + + + ksoftirqd/1 [18]66.2ms + + + + + + + + + + migration/2 [22]89.0ms + + + + + + + + + + + + + + + ksoftirqd/2 [23]52.6ms + + + + + + + + + + migration/3 [27]88.6ms + + + + + + + + + + + + + + + ksoftirqd/3 [28]63.4ms + + + + + + + + + + migration/4 [32]89.1ms + + + + + + + + + ksoftirqd/4 [33]60.0ms + + + + + + + + + + migration/5 [37]89.2ms + + + + + + + + + ksoftirqd/5 [38]61.1ms + + + + + + + + + + migration/6 [42]87.1ms + + + + + + + + + ksoftirqd/6 [43]44.8ms + + + + + + + + + + migration/7 [47]90.0ms + + + + + + + ksoftirqd/7 [48]66.7ms + + + + + + + + + kworker/u16:1 [52]34.7ms + + + + + + + kworker/u16:2 [53]73.4ms + + + + + + + kworker/u16:3 [54]29.6ms + + + + + + + kworker/u16:4 [55]30.9ms + + + + + + + + + + + kworker/u16:5 [56]98.0ms + + + + + + + modprobe [823]7.9ms + + + + + + + + kworker/u16:6 [57]32.3ms + + + + + + + + kdevtmpfs [59]1.5ms + + + + + + + + kauditd [61]5.4ms + + + + + + + + + + kcompactd0 [65]5.3ms + + + + + + + + khugepaged [67]5.9ms + + + + + + + kworker/2:1 [73]7.8ms + + + + + + + + + + + + + kworker/6:1 [92]7.7ms + + + + + + + kworker/6:1H [93]12.1ms + + + + + + + kworker/3:1 [94]2.4ms + + + + + + + + + + + kworker/1:1 [95]37.0ms + + + + + + + + + + + + + + + kworker/5:1 [96]52.7ms + + + + + + + + + + + + + + + + + kworker/4:1 [97]50.1ms + + + + + + + + + kworker/7:1 [98]6.1ms + + + + + + + + + + + + + + + + + + kworker/6:2 [110]9.9ms + + + + + + + + kworker/1:1H [113]17.8ms + + + + + + + + + + kworker/0:2 [126]1.4ms + + + + + + + kworker/0:3 [127]3.7ms + + + + + + + kworker/0:4 [128]8.9ms + + + + + + + + kworker/3:1H [151]14.3ms + + + + + + + kworker/5:1H [170]29.5ms + + + + + + + + + kworker/2:2 [174]14.7ms + + + + + + + ata_sff [177]1.1ms + + + + + + + + + + + + + + + + + + + + + + + kworker/0:1H [240]12.0ms + + + + + + + + kworker/7:1H [261]24.8ms + + + + + + + jbd2/sda3-8 [262]18.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + loop0 [269]332.7ms + + + + + + + loop1 [294]14.8ms + + + + + + + jbd2/loop1-8 [295]3.4ms + + + + + + + + kworker/4:1H [297]12.4ms + + + + + + + kworker/2:1H [310]16.7ms + + + + + + + + + kworker/1:2 [335]7.6ms + + + + + + + kworker/5:2 [353]2.0ms + + + + + + + + + + + + + + + + + + + kworker/3:2 [413]23.2ms + + + + + + + + + + kworker/2:4 [822]2.2ms + + + + + + + + + + + + + kworker/7:4 [3985]15.4ms + + + + + + + + + + + + + + + + + + kworker/6:7 [5065]11.6ms + + + + + + + + + + + cq_cpu_prio_1 [6701]6.0ms + + + + + + + + + + + + + + start-networkin [333]40.1ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [352]604.1ms + + + + + + + + modprobe [734]9.3ms + + + + + + + + + + + + + + + + + + + + + + python3 [996]221.1ms + + + + + + + + + + + + + + + + + + + + + + + python3 [1740]249.4ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + systemd-bootcha [334]48.965s + + + + + + + + + + + systemd-modules [336]68.0ms + + + + + + + udevadm [338]15.1ms + + + + + + + + + + + udevadm [345]95.0ms + + + + + + + systemd-tmpfile [347]8.4ms + + + + + + + apparmor.system [354]16.6ms + + + + + + + systemd-detect- [357]3.8ms + + + + + + + apparmor.system [364]2.5ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + systemd-journal [355]466.1ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [356]1.039s + + + + + + + + + + + + + systemd-udevd [373]17.9ms + + + + + + + + + hw-management-c [628]3.4ms + + + + + + + + + + + + systemd-udevd [374]19.4ms + + + + + + + systemd-udevd [375]7.4ms + + + + + + + + + + + + + + + + + systemd-udevd [376]26.6ms + + + + + + + hw-management-t [465]1.1ms + + + + + + + + + + + (spawn) [609]11.4ms + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [377]22.9ms + + + + + + + kdump-config [429]3.6ms + + + + + + + + systemctl [457]1.3ms + + + + + + + + + + + + + + + + + + + + + systemd-udevd [378]31.7ms + + + + + + + + + + + + + systemd-udevd [614]6.9ms + + + + + + + + + + + + systemd-udevd [379]8.2ms + + + + + + + + + + + + + systemd-udevd [380]15.6ms + + + + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [381]59.9ms + + + + + + + + + + hdparm [455]8.1ms + + + + + + + + + + grep [490]7.2ms + + + + + + + + + hdparm [493]1.0ms + + + + + + + + udevadm [494]1.8ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [382]43.1ms + + + + + + + + + + + kdump-config [428]8.0ms + + + + + + + + systemctl [453]2.4ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [383]60.4ms + + + + + + + systemd-sysctl [414]3.7ms + + + + + + + kdump-config [436]3.7ms + + + + + + + + systemctl [454]2.5ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [384]80.2ms + + + + + + + + + + + + + + + + + + + systemd-udevd [385]43.7ms + + + + + + + + + kdump-config [434]8.7ms + + + + + + + + + + systemctl [456]4.7ms + + + + + + + + + + + + + + + + + systemd-udevd [386]10.8ms + + + + + + + + + + + hw-management-c [604]11.0ms + + + + + + + + + + + + + + + + systemd-udevd [387]11.3ms + + + + + + + + + + + + + systemd-udevd [388]11.4ms + + + + + + + hw-management-t [463]5.5ms + + + + + + + + + + + + + systemd-udevd [613]5.3ms + + + + + + + + + + + + + + + + + + systemd-udevd [389]39.0ms + + + + + + + hw-management-c [617]5.8ms + + + + + + + + + hw-management-t [682]5.5ms + + + + + + + + + + + + + + systemd-udevd [390]15.2ms + + + + + + + + + + + + + + + + + + + systemd-udevd [392]15.7ms + + + + + + + hw-management-c [595]3.8ms + + + + + + + + + + + + + + + + + + systemd-udevd [396]65.4ms + + + + + + + hw-management-c [588]5.8ms + + + + + + + + + systemd-udevd [643]6.4ms + + + + + + + + + + + + + + + + systemd-udevd [397]41.6ms + + + + + + + kdump-config [431]3.9ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [398]57.9ms + + + + + + + hw-management-t [462]7.1ms + + + + + + + hw-management-c [621]2.9ms + + + + + + + + + + + + + + + + + + + + systemd-udevd [399]48.4ms + + + + + + + + + + + systemd-udevd [623]11.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [400]56.4ms + + + + + + + hw-management-t [469]5.2ms + + + + + + + + + hw-management-c [519]5.7ms + + + + + + + + + + + hw-management-t [689]11.6ms + + + + + + + + + modprobe [721]10.2ms + + + + + + + + + + + + + + systemd-udevd [401]22.2ms + + + + + + + + + + + systemd-udevd [640]3.0ms + + + + + + + + + + + + + + + + + + + + systemd-udevd [402]52.4ms + + + + + + + hw-management-c [597]6.0ms + + + + + + + + + + + + systemd-udevd [403]13.3ms + + + + + + + + + hw-management-c [616]11.2ms + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [404]21.6ms + + + + + + + hw-management-t [464]2.5ms + + + + + + + + + + + + + + + + systemd-udevd [405]22.1ms + + + + + + + hw-management-c [620]3.3ms + + + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [406]35.1ms + + + + + + + + + kdump-config [430]3.4ms + + + + + + + + systemctl [452]6.3ms + + + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [407]22.9ms + + + + + + + kdump-config [433]4.2ms + + + + + + + + systemctl [451]3.1ms + + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [408]40.6ms + + + + + + + kdump-config [432]5.6ms + + + + + + + + + + + + + + + + + + + systemd-udevd [880]47.9ms + + + + + + + hw-management-c [937]5.6ms + + + + + + + hw-management-c [1153]15.5ms + + + + + + + + + hw-management-c [1192]1.5ms + + + + + + + xargs [1291]1.6ms + + + + + + + xargs [1293]1.4ms + + + + + + + + flock [1618]1.3ms + + + + + + + led_fan1_state [1754]23.5ms + + + + + + + + + grep [2091]1.7ms + + + + + + + + + grep [2374]2.0ms + + + + + + + + + + + + + + + + + hw-management-t [2878]34.2ms + + + + + + + + + + + + systemd-udevd [927]16.0ms + + + + + + + + + + + + + + + + + systemd-udevd [928]82.9ms + + + + + + + + + hw-management-c [3147]15.7ms + + + + + + + + hw-management-c [3184]2.1ms + + + + + + + + xargs [3194]1.6ms + + + + + + + xargs [3196]1.2ms + + + + + + + xargs [3199]1.5ms + + + + + + + xargs [3201]1.4ms + + + + + + + xargs [3204]1.4ms + + + + + + + cut [3207]1.2ms + + + + + + + + + + + + + + + + + + systemd-udevd [929]68.4ms + + + + + + + hw-management-c [997]14.6ms + + + + + + + + hw-management-c [1015]1.6ms + + + + + + + + + + + + systemd-udevd [930]20.7ms + + + + + + + + + hw-management-c [1154]15.4ms + + + + + + + + + + led_fan2_state [1493]24.0ms + + + + + + + + + + + + + + + systemd-udevd [933]38.9ms + + + + + + + kdump-config [2882]3.5ms + + + + + + + hw-management-t [3331]2.3ms + + + + + + + + + + + + + + + + systemd-udevd [934]41.7ms + + + + + + + hw-management-c [966]12.0ms + + + + + + + hw-management-c [986]9.9ms + + + + + + + hw-management-c [1012]9.6ms + + + + + + + hw-management-c [1062]11.7ms + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [935]67.5ms + + + + + + + hw-management-c [1155]15.0ms + + + + + + + + hw-management-c [1186]1.4ms + + + + + + + xargs [1196]1.5ms + + + + + + + + + xargs [1197]1.4ms + + + + + + + xargs [1199]1.4ms + + + + + + + + + + + + led_fan1_state [1509]22.5ms + + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [938]40.7ms + + + + + + + hw-management-c [1152]15.8ms + + + + + + + hw-management-c [1178]1.4ms + + + + + + + + + xargs [1205]1.6ms + + + + + + + + + led_fan2_state [1628]22.4ms + + + + + + + + + + + + + + + + + + + hw-management-t [2876]20.9ms + + + + + + + + + hw-management-c [3306]11.1ms + + + + + + + + hw-management-c [3503]1.3ms + + + + + + + + + + + + systemd-udevd [939]18.6ms + + + + + + + + + systemd-udevd [1156]32.5ms + + + + + + + hw-management-c [1191]15.2ms + + + + + + + led_fan3_state [1527]16.8ms + + + + + + + + + + + grep [1777]1.1ms + + + + + + + + + + + + + + hw-management-t [2915]36.9ms + + + + + + + sleep [3032]1.1ms + + + + + + + + + + + hw-management-p [4410]31.6ms + + + + + + + + + hw_management_p [4582]56.8ms + + + + + + + + + sh [4603]1.3ms + + + + + + + + + + + hw_management_p [4657]60.0ms + + + + + + + + sh [4660]1.0ms + + + + + + + sh [4664]1.9ms + + + + + + + sh [4668]1.3ms + + + + + + + sh [4672]2.4ms + + + + + + + + hw-management-c [4676]5.5ms + + + + + + + + + + systemd-udevd [1157]15.8ms + + + + + + + hw-management-c [1174]15.5ms + + + + + + + + flock [1624]1.2ms + + + + + + + led_fan3_state [1772]19.6ms + + + + + + + + + cut [2239]1.3ms + + + + + + + + + + + + + + + + hw-management-t [2919]38.9ms + + + + + + + + sleep [3033]1.1ms + + + + + + + + + + + hw-management-p [4409]34.7ms + + + + + + + + + hw_management_p [4588]57.5ms + + + + + + + + sh [4595]1.1ms + + + + + + + sh [4608]1.3ms + + + + + + + + + + + hw_management_p [4658]59.8ms + + + + + + + + + sh [4666]1.0ms + + + + + + + sh [4670]2.4ms + + + + + + + sh [4674]2.5ms + + + + + + + + + + systemd-udevd [1158]25.1ms + + + + + + + hw-management-c [1200]14.5ms + + + + + + + led_fan4_state [1563]23.3ms + + + + + + + + + + + + + grep [2069]1.8ms + + + + + + + + + + + + + hw-management-t [3051]4.7ms + + + + + + + + + hw-management-c [3151]18.7ms + + + + + + + + hw-management-c [3316]1.6ms + + + + + + + + xargs [3350]1.6ms + + + + + + + xargs [3351]1.5ms + + + + + + + xargs [3353]1.3ms + + + + + + + + + + + + + + + systemd-udevd [1159]22.3ms + + + + + + + + + hw-management-c [1283]15.6ms + + + + + + + hw-management-c [1379]1.3ms + + + + + + + + + flock [1662]1.3ms + + + + + + + led_fan4_state [1801]21.2ms + + + + + + + + + + + + hw-management-t [3052]2.0ms + + + + + + + + + hw-management-c [3152]20.9ms + + + + + + + + hw-management-c [3192]2.1ms + + + + + + + + xargs [3200]1.3ms + + + + + + + + + + cut [3209]1.3ms + + + + + + + + hw-management-c [3355]1.5ms + + + + + + + hw-management-c [3455]1.5ms + + + + + + + + xargs [3487]1.6ms + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [1160]79.4ms + + + + + + + hw-management-c [1273]15.7ms + + + + + + + + led_fan5_state [1601]23.8ms + + + + + + + + + + grep [1814]1.1ms + + + + + + + + + + + + hw-management-t [3047]6.0ms + + + + + + + hw-management-c [3113]13.3ms + + + + + + + hw-management-c [3128]2.0ms + + + + + + + + hw-management-c [3760]10.4ms + + + + + + + hw-management-c [3826]10.3ms + + + + + + + kdump-config [3957]1.8ms + + + + + + + + + + systemd-udevd [1161]16.0ms + + + + + + + hw-management-c [1175]17.2ms + + + + + + + hw-management-c [1222]1.4ms + + + + + + + xargs [1244]1.6ms + + + + + + + + + + + + + flock [1672]1.3ms + + + + + + + led_fan5_state [1829]22.4ms + + + + + + + + grep [2230]2.0ms + + + + + + + + led_fan5_state [2765]1.2ms + + + + + + + + + + + + + + hw-management-c [2879]39.3ms + + + + + + + + sleep [2936]3.2ms + + + + + + + + + + + + + + + + systemd-udevd [1162]53.7ms + + + + + + + hw-management-c [1177]15.3ms + + + + + + + hw-management-c [1208]1.4ms + + + + + + + xargs [1213]1.6ms + + + + + + + + + + + hw-management-c [1214]1.6ms + + + + + + + + led_fan6_state [1692]23.3ms + + + + + + + + + grep [2094]1.7ms + + + + + + + + + hw-management-t [3049]1.1ms + + + + + + + hw-management-t [3215]10.4ms + + + + + + + hw-management-t [3292]1.1ms + + + + + + + + xargs [3318]1.6ms + + + + + + + xargs [3319]1.3ms + + + + + + + + hw-management-c [3857]9.7ms + + + + + + + + + + + + systemd-udevd [1163]24.4ms + + + + + + + hw-management-c [1176]14.6ms + + + + + + + + + hw-management-c [1207]1.4ms + + + + + + + + + + led_fan6_state [1637]23.0ms + + + + + + + + + grep [1726]1.7ms + + + + + + + + + + + + grep [2788]1.3ms + + + + + + + + + + + + + hw-management-c [3197]19.1ms + + + + + + + + hw-management-c [3271]2.1ms + + + + + + + xargs [3301]1.6ms + + + + + + + xargs [3302]1.3ms + + + + + + + xargs [3304]1.3ms + + + + + + + xargs [3307]1.4ms + + + + + + + + + hw-management-c [3514]1.2ms + + + + + + + + + + xargs [3519]1.3ms + + + + + + + xargs [3522]1.3ms + + + + + + + + + + systemd-udevd [1164]19.4ms + + + + + + + hw-management-c [1180]15.4ms + + + + + + + + + led_psu_state [1466]25.9ms + + + + + + + + + + + + + + + + + + kdump-config [2883]3.4ms + + + + + + + + + + systemd-udevd [1165]15.9ms + + + + + + + + + + + hw-management-c [1189]16.1ms + + + + + + + + + + + flock [1671]1.3ms + + + + + + + + + led_psu_state [1815]21.6ms + + + + + + + + + grep [2077]1.2ms + + + + + + + + + grep [2780]1.9ms + + + + + + + + kdump-config [2880]3.5ms + + + + + + + + + + + + systemd-udevd [1166]15.2ms + + + + + + + hw-management-c [1250]14.5ms + + + + + + + hw-management-c [1295]1.3ms + + + + + + + xargs [1304]1.5ms + + + + + + + + + xargs [1308]1.4ms + + + + + + + xargs [1309]1.4ms + + + + + + + + + + + + led_status_stat [1590]20.5ms + + + + + + + + + + + + + + + + + kdump-config [2881]2.9ms + + + + + + + + + + + + + + + + systemd-udevd [1168]42.0ms + + + + + + + + + hw-management-c [1184]15.3ms + + + + + + + hw-management-c [1288]1.3ms + + + + + + + xargs [1336]1.5ms + + + + + + + xargs [1337]1.2ms + + + + + + + + flock [1597]1.2ms + + + + + + + + + led_status_stat [1698]22.6ms + + + + + + + + grep [1775]1.0ms + + + + + + + + + + hw-management-t [3045]4.4ms + + + + + + + + + hw-management-c [3123]21.5ms + + + + + + + + hw-management-c [3157]2.1ms + + + + + + + xargs [3164]1.5ms + + + + + + + xargs [3165]1.5ms + + + + + + + xargs [3166]1.4ms + + + + + + + xargs [3168]1.4ms + + + + + + + cut [3169]1.3ms + + + + + + + + hw-management-c [3317]1.7ms + + + + + + + + xargs [3328]1.6ms + + + + + + + xargs [3329]1.4ms + + + + + + + + + + systemd-udevd [1170]24.7ms + + + + + + + + + hw-management-c [1190]15.6ms + + + + + + + hw-management-c [1287]1.3ms + + + + + + + xargs [1303]1.4ms + + + + + + + xargs [1314]1.3ms + + + + + + + xargs [1315]1.3ms + + + + + + + + led_uid_state [1639]16.4ms + + + + + + + + grep [1810]1.5ms + + + + + + + + grep [2068]1.8ms + + + + + + + + + kdump-config [2885]3.5ms + + + + + + + + + + + + systemd-udevd [1171]20.7ms + + + + + + + + + + + + + + + + + + + systemd-udevd [1173]60.9ms + + + + + + + + + + + systemd-udevd [1187]14.2ms + + + + + + + hw-management-t [3044]5.5ms + + + + + + + + + hw-management-c [3114]21.3ms + + + + + + + + hw-management-c [3130]2.3ms + + + + + + + xargs [3145]1.6ms + + + + + + + cut [3146]1.3ms + + + + + + + + hw-management-c [3233]1.8ms + + + + + + + + xargs [3266]1.5ms + + + + + + + + + + + + + + + + + + + + systemd-udevd [1382]47.1ms + + + + + + + hw-management-t [3050]3.9ms + + + + + + + hw-management-t [3241]11.0ms + + + + + + + + + + + + systemd-udevd [1521]44.8ms + + + + + + + + + + + systemd-udevd [2331]28.8ms + + + + + + + + hw-management-c [3268]12.4ms + + + + + + + + + hw-management-c [3474]1.8ms + + + + + + + + xargs [3498]1.5ms + + + + + + + + + xargs [3499]1.4ms + + + + + + + cut [3500]1.3ms + + + + + + + + + + + + systemd-udevd [2863]24.0ms + + + + + + + systemd-udevd [3085]13.7ms + + + + + + + + + hw-management-c [3129]20.2ms + + + + + + + + hw-management-c [3171]2.0ms + + + + + + + xargs [3179]1.5ms + + + + + + + xargs [3180]1.3ms + + + + + + + xargs [3182]1.4ms + + + + + + + cut [3183]1.2ms + + + + + + + + find [3510]2.3ms + + + + + + + + systemd-udevd [5544]2.2ms + + + + + + + + systemd-udevd [6484]7.6ms + + + + + + + systemd-udevd [6491]2.3ms + + + + + + + + + systemd-udevd [6705]23.8ms + + + + + + + hw-management-t [6708]9.1ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hw-management.s [6716]125.7ms + + + + + + + + + + lspci [6727]11.8ms + + + + + + + grep [6728]1.4ms + + + + + + + + systemd-udevd [6706]8.1ms + + + + + + + hw-management-t [6904]13.2ms + + + + + + + + + hw-management-c [7688]11.9ms + + + + + + + + flock [7700]1.4ms + + + + + + + + systemd-udevd [6707]6.1ms + + + + + + + + + + + + + + + + + + + hw-management-t [6779]78.1ms + + + + + + + + + flock [7801]1.5ms + + + + + + + + systemd-udevd [6709]9.3ms + + + + + + + hw-management-t [6878]13.6ms + + + + + + + + + hw-management-c [7405]9.7ms + + + + + + + + flock [7407]1.5ms + + + + + + + + + + + + + + + + + + + + systemd-udevd [6830]81.4ms + + + + + + + hw-management-t [6831]11.7ms + + + + + + + hw-management-t [6929]11.2ms + + + + + + + + + hw-management-c [7738]11.7ms + + + + + + + + + flock [7741]1.5ms + + + + + + + + + + systemd-udevd [6833]9.0ms + + + + + + + hw-management-t [6834]13.3ms + + + + + + + hw-management-t [6962]13.8ms + + + + + + + + + hw-management-c [7687]13.7ms + + + + + + + + flock [7693]1.4ms + + + + + + + + + + + + systemd-udevd [6836]15.4ms + + + + + + + hw-management-t [6839]11.5ms + + + + + + + hw-management-t [6938]13.5ms + + + + + + + + + + + + hw-management-c [7644]11.7ms + + + + + + + + flock [7663]1.3ms + + + + + + + + systemd-udevd [6842]6.5ms + + + + + + + hw-management-t [6845]14.1ms + + + + + + + hw-management-t [6934]14.5ms + + + + + + + + + hw-management-c [7538]12.0ms + + + + + + + + flock [7552]1.4ms + + + + + + + + systemd-udevd [6849]6.6ms + + + + + + + hw-management-t [6856]14.0ms + + + + + + + hw-management-t [7029]11.7ms + + + + + + + + + hw-management-c [7690]11.1ms + + + + + + + + flock [7699]1.3ms + + + + + + + + systemd-udevd [6857]9.7ms + + + + + + + + + hw-management-t [6871]14.8ms + + + + + + + hw-management-c [7508]11.2ms + + + + + + + + flock [7510]1.3ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [6866]320.2ms + + + + + + + hw-management-t [6870]11.3ms + + + + + + + + + hw-management-t [6994]13.2ms + + + + + + + systemd-sysctl [7404]8.0ms + + + + + + + systemd-sysctl [7661]2.8ms + + + + + + + systemd-sysctl [7706]7.5ms + + + + + + + systemd-sysctl [7742]7.7ms + + + + + + + + + hw-management-c [7748]11.5ms + + + + + + + + flock [7760]1.4ms + + + + + + + + systemd-udevd [6872]5.4ms + + + + + + + + + hw-management-t [6876]12.9ms + + + + + + + hw-management-c [7466]11.7ms + + + + + + + + flock [7476]1.0ms + + + + + + + + systemd-udevd [6883]5.2ms + + + + + + + hw-management-t [6909]15.1ms + + + + + + + hw-management-c [7486]8.1ms + + + + + + + + flock [7488]1.2ms + + + + + + + + systemd-udevd [6893]6.0ms + + + + + + + + + hw-management-t [6901]12.5ms + + + + + + + + + hw-management-c [7539]12.9ms + + + + + + + + flock [7553]1.1ms + + + + + + + + systemd-udevd [6908]5.5ms + + + + + + + hw-management-t [6926]13.1ms + + + + + + + + + hw-management-c [7423]13.2ms + + + + + + + + flock [7429]1.4ms + + + + + + + + systemd-udevd [6915]5.3ms + + + + + + + hw-management-t [6925]12.9ms + + + + + + + + + hw-management-c [7597]8.7ms + + + + + + + + flock [7604]1.2ms + + + + + + + + + + systemd-udevd [6923]5.1ms + + + + + + + hw-management-t [6930]12.5ms + + + + + + + + + hw-management-c [7647]11.5ms + + + + + + + + flock [7665]1.7ms + + + + + + + + systemd-udevd [6951]5.3ms + + + + + + + hw-management-t [6966]13.4ms + + + + + + + hw-management-c [7332]12.4ms + + + + + + + + flock [7339]1.2ms + + + + + + + + + systemd-udevd [6954]5.4ms + + + + + + + + + hw-management-t [6973]12.7ms + + + + + + + hw-management-c [7378]10.5ms + + + + + + + + flock [7385]1.6ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [6967]258.4ms + + + + + + + + + hw-management-t [6978]11.7ms + + + + + + + systemd-sysctl [7703]4.5ms + + + + + + + systemd-sysctl [7746]4.3ms + + + + + + + + + hw-management-c [7773]12.8ms + + + + + + + + flock [7782]1.5ms + + + + + + + + systemd-udevd [6975]7.7ms + + + + + + + + + hw-management-t [6993]13.8ms + + + + + + + + + hw-management-c [7331]12.8ms + + + + + + + + flock [7340]1.4ms + + + + + + + + flock [7792]1.9ms + + + + + + + + + + systemd-udevd [6983]5.3ms + + + + + + + hw-management-t [7005]13.5ms + + + + + + + + + hw-management-c [7596]11.0ms + + + + + + + + flock [7605]1.5ms + + + + + + + + systemd-udevd [7007]5.3ms + + + + + + + hw-management-t [7025]11.0ms + + + + + + + hw-management-c [7422]12.0ms + + + + + + + + flock [7427]1.3ms + + + + + + + + systemd-udevd [7013]5.6ms + + + + + + + hw-management-t [7040]12.8ms + + + + + + + hw-management-c [7490]9.6ms + + + + + + + + flock [7497]1.4ms + + + + + + + + + + systemd-udevd [7017]5.9ms + + + + + + + hw-management-t [7023]11.6ms + + + + + + + + + hw-management-c [7664]11.9ms + + + + + + + + flock [7685]1.2ms + + + + + + + + systemd-udevd [7022]5.4ms + + + + + + + hw-management-t [7045]10.9ms + + + + + + + hw-management-c [7350]12.0ms + + + + + + + + flock [7368]1.3ms + + + + + + + + systemd-udevd [7689]3.8ms + + + + + + + + + hw-management-c [7691]12.5ms + + + + + + + + flock [7697]1.3ms + + + + + + + + + + + + systemd-udevd [7705]4.0ms + + + + + + + hw-management-c [7715]11.0ms + + + + + + + + flock [7726]1.5ms + + + + + + + + systemd-udevd [7707]4.1ms + + + + + + + hw-management-c [7709]11.5ms + + + + + + + + + + flock [7713]1.5ms + + + + + + + + + + systemd-udevd [7710]4.1ms + + + + + + + hw-management-c [7716]11.0ms + + + + + + + + flock [7720]1.4ms + + + + + + + + systemd-udevd [7736]4.3ms + + + + + + + + + hw-management-c [7743]11.8ms + + + + + + + + flock [7745]1.5ms + + + + + + + + + + + + + + systemd-udevd [7737]97.1ms + + + + + + + systemd-sysctl [7772]4.6ms + + + + + + + + systemd-udevd [8370]29.5ms + + + + + + + + + + + + + + + + + + + + + + + systemd-udevd [8374]92.9ms + + + + + + + + + systemd-sysctl [9062]6.4ms + + + + + + + + netfilter-persi [358]7.1ms + + + + + + + run-parts [363]10.4ms + + + + + + + + systemd-sysctl [360]22.5ms + + + + + + + + + auditd [411]55.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + haveged [412]342.3ms + + + + + + + + + auditd [416]35.6ms + + + + + + + audisp-tacplus [418]20.3ms + + + + + + + + + + (genrules) [422]18.1ms + + + + + + + + cat [459]8.8ms + + + + + + + + awk [442]4.5ms + + + + + + + auditctl [477]1.9ms + + + + + + + + (ate-utmp) [547]1.3ms + + + + + + + modprobe [583]4.0ms + + + + + + + cron [585]10.3ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dbus-daemon [586]291.1ms + + + + + + + + + + + + + e2scrub_all [589]23.2ms + + + + + + + sh [592]2.0ms + + + + + + + hw-management-r [594]5.6ms + + + + + + + + systemctl [615]2.2ms + + + + + + + hw-management-r [652]1.1ms + + + + + + + + + + + + + + lspci [658]55.0ms + + + + + + + grep [659]1.4ms + + + + + + + + kdump-tools [593]3.9ms + + + + + + + systemctl [606]2.4ms + + + + + + + kdump-config [649]5.0ms + + + + + + + + systemctl [654]2.3ms + + + + + + + + + kexec [596]2.9ms + + + + + + + systemctl [605]4.6ms + + + + + + + + + + monit [598]7.0ms + + + + + + + systemctl [611]4.8ms + + + + + + + + + start-stop-daem [679]9.4ms + + + + + + + + + + + + + + + + + + + + + + ras-mc-ctl [600]136.7ms + + + + + + + + + + + rasdaemon [608]15.6ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rasdaemon [610]2.556s + + + + + + + + + + + + + rc.local [619]7.4ms + + + + + + + + grep [632]1.4ms + + + + + + + sed [633]1.4ms + + + + + + + + + + systemctl [691]4.2ms + + + + + + + + + + + + + + + + rsyslogd [622]75.7ms + + + + + + + + + + + + + + + smartd [625]74.6ms + + + + + + + (eygen.sh) [629]1.1ms + + + + + + + + + sysfsutils [634]4.4ms + + + + + + + systemctl [653]2.3ms + + + + + + + sed [673]1.8ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + systemd-logind [636]193.6ms + + + + + + + systemd-user-se [637]5.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + containerd [639]1.052s + + + + + + + + + + + + + sshd [651]33.7ms + + + + + + + kexec-load [662]3.3ms + + + + + + + (sd-executor) [703]4.8ms + + + + + + + systemd-debug-g [707]6.9ms + + + + + + + systemd-getty-g [709]6.2ms + + + + + + + systemd-gpt-aut [710]6.1ms + + + + + + + systemd-sysv-ge [716]23.1ms + + + + + + + + + + sh [742]1.7ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hw-management.s [743]157.3ms + + + + + + + + + lspci [788]1.9ms + + + + + + + grep [789]1.6ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + depmod [797]1.923s + + + + + + + + + + + udevadm [824]82.3ms + + + + + + + sleep [3859]1.1ms + + + + + + + hw-management-s [4289]11.5ms + + + + + + + + sleep [4298]1.1ms + + + + + + + + sshd [744]15.9ms + + + + + + + + + + + sshd [6557]70.7ms + + + + + + + + sshd [6558]9.7ms + + + + + + + + + + + sshd [6563]95.2ms + + + + + + + + + + + + + + + + + + bash [6564]104.4ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + show [7229]573.8ms + + + + + + + sh [7354]2.4ms + + + + + + + + + sudo [7356]8.5ms + + + + + + + + + docker [7382]43.4ms + + + + + + + + + + + + + + sh [7425]1.9ms + + + + + + + + + + sudo [7426]6.8ms + + + + + + + + + + tail [7467]38.9ms + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [9241]378.3ms + + + + + + + + + + + + + + + + + + + + + + + + + python3 [9250]379.6ms + + + + + + + + + + + + + + + + + + + + + + + python3 [9325]322.0ms + + + + + + + + + + + + + + + + + + + + + python3 [9334]288.0ms + + + + + + + + + + + + + + + + + + + + + python3 [9339]287.0ms + + + + + + + + + + + + + + + + + + + python3 [9344]258.4ms + + + + + + + + config-chassisd [748]7.0ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [752]605.0ms + + + + + + + + + + agetty [749]11.2ms + + + + + + + + + agetty [750]4.7ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dockerd [758]1.363s + + + + + + + + + exe [890]78.9ms + + + + + + + + + exe [952]97.8ms + + + + + + + + + exe [1006]74.7ms + + + + + + + exe [1086]35.4ms + + + + + + + + + + + exe [1121]91.7ms + + + + + + + + + exe [1246]60.1ms + + + + + + + + + exe [1629]60.9ms + + + + + + + + + exe [1867]69.4ms + + + + + + + exe [2253]43.2ms + + + + + + + + + exe [2524]73.2ms + + + + + + + exe [2862]58.7ms + + + + + + + + + exe [2923]58.3ms + + + + + + + + + exe [3111]73.3ms + + + + + + + + + exe [3425]75.1ms + + + + + + + exe [3733]10.8ms + + + + + + + exe [3770]6.3ms + + + + + + + exe [3814]68.8ms + + + + + + + exe [3825]50.5ms + + + + + + + exe [3916]23.8ms + + + + + + + exe [3934]24.2ms + + + + + + + exe [3946]12.7ms + + + + + + + exe [3958]6.8ms + + + + + + + runc [3982]13.9ms + + + + + + + exe [4030]24.2ms + + + + + + + exe [4116]13.8ms + + + + + + + runc [4836]8.1ms + + + + + + + runc [5116]6.9ms + + + + + + + runc [5562]6.5ms + + + + + + + runc [7544]7.4ms + + + + + + + + + database.sh [4002]15.4ms + + + + + + + + + + + + + + + + docker [4007]160.2ms + + + + + + + + + + docker [4019]41.7ms + + + + + + + + + docker [4077]37.3ms + + + + + + + ebtables-restor [4245]8.4ms + + + + + + + docker [4266]41.8ms + + + + + + + sleep [4299]1.0ms + + + + + + + + + docker [4597]33.6ms + + + + + + + + + + + + sonic-db-cli [4651]101.6ms + + + + + + + grep [4652]1.6ms + + + + + + + + sleep [4659]1.1ms + + + + + + + docker [4701]33.6ms + + + + + + + + + + sonic-db-cli [4728]74.0ms + + + + + + + grep [4729]1.5ms + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [4734]263.9ms + + + + + + + + + + + sonic-db-cli [4735]94.0ms + + + + + + + + + + + db_migrator.py [4736]120.9ms + + + + + + + + + + + + + + containerd-shim [4212]87.0ms + + + + + + + + + runc [4223]16.6ms + + + + + + + 7 [4230]5.0ms + + + + + + + + + + + + + + + + + + + + + supervisord [4233]274.8ms + + + + + + + + + + + + + + + + + + + + j2 [4255]188.3ms + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [4302]230.6ms + + + + + + + python3 [4305]45.2ms + + + + + + + + + + + + + python3 [4687]130.5ms + + + + + + + rsyslogd [4688]16.6ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + redis-server [4689]5.090s + + + + + + + bash [4690]7.2ms + + + + + + + + + + runc [4277]12.7ms + + + + + + + runc:[2:INIT] [4286]1.0ms + + + + + + + + + + runc [4629]13.2ms + + + + + + + runc:[2:INIT] [4638]1.1ms + + + + + + + + runc [4712]12.2ms + + + + + + + runc [5002]14.7ms + + + + + + + + + + + + + + + + + supervisorctl [5013]197.4ms + + + + + + + + + + runc [5105]16.6ms + + + + + + + runc:[2:INIT] [5114]4.7ms + + + + + + + + + + runc [8653]14.7ms + + + + + + + + + + + + + + + + + supervisorctl [8663]179.0ms + + + + + + + + + + runc [11773]13.3ms + + + + + + + + + + + + + + + + + + supervisorctl [11786]183.7ms + + + + + + + + database.sh [4739]7.3ms + + + + + + + + + + + docker [4743]68.5ms + + + + + + + + config-setup [4740]5.2ms + + + + + + + + + + + sonic-db-cli [4744]98.2ms + + + + + + + + + + + + + + + + determine-reboo [4741]170.7ms + + + + + + + finalize-warmbo [4742]9.8ms + + + + + + + + + + sonic-db-cli [4759]79.9ms + + + + + + + grep [4760]1.8ms + + + + + + + + + + + + + + + + sonic-db-cli [4780]138.9ms + + + + + + + + + + + + + + + sonic-db-cli [4798]117.6ms + + + + + + + + + + pcie-check.sh [4766]11.8ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [4771]400.8ms + + + + + + + + + + sudo [4883]41.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pcieutil [4902]628.1ms + + + + + + + + file [5009]16.3ms + + + + + + + + grep [4884]2.3ms + + + + + + + + redis-cli [5094]5.5ms + + + + + + + + + + docker [5095]44.8ms + + + + + + + + bgp.sh [4772]14.3ms + + + + + + + + + + + + + sonic-db-cli [4790]121.6ms + + + + + + + + + + + + + + + + + sonic-db-cli [4796]127.6ms + + + + + + + + + + + + + + + sonic-db-cli [4849]148.3ms + + + + + + + bgp.sh [4919]10.3ms + + + + + + + + + docker [4932]37.8ms + + + + + + + + + python [4956]25.3ms + + + + + + + + + + + + + + + + + + + + python3 [4985]225.0ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + caclmgrd [4773]270.5ms + + + + + + + sh [4801]1.7ms + + + + + + + ip [4802]1.8ms + + + + + + + awk [4803]1.1ms + + + + + + + + + sh [4806]1.9ms + + + + + + + sh [4831]1.5ms + + + + + + + sh [4869]1.5ms + + + + + + + sh [4904]1.6ms + + + + + + + sh [4923]1.4ms + + + + + + + + iptables [4924]1.7ms + + + + + + + + copp-config.sh [4774]9.5ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [4779]413.5ms + + + + + + + + hostname-config [4775]11.7ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [4786]418.8ms + + + + + + + mv [4921]7.4ms + + + + + + + + interfaces-conf [4776]14.2ms + + + + + + + + + + + + + + + + + + + + + + + + + python3 [4788]253.6ms + + + + + + + + + + + + + + + + + + + + + + + python3 [4873]234.3ms + + + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [5020]374.5ms + + + + + + + + + + + + + + + + + sonic-cfggen [5093]219.3ms + + + + + + + systemctl [5129]2.4ms + + + + + + + + + + logrotate-confi [4777]11.8ms + + + + + + + logrotate-confi [4791]1.1ms + + + + + + + + sed [4793]2.2ms + + + + + + + awk [4794]1.7ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [4795]436.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + procdockerstats [4778]309.9ms + + + + + + + + + sh [4814]1.3ms + + + + + + + + + + + + + docker [4815]40.7ms + + + + + + + + sh [11595]1.1ms + + + + + + + + + + + docker [11596]57.6ms + + + + + + + + sh [11871]1.3ms + + + + + + + + ps [11872]8.1ms + + + + + + + + + rsyslog-config. [4781]12.5ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [4787]366.5ms + + + + + + + + + + + + jq [4892]66.6ms + + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [4929]343.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + healthd [4783]625.8ms + + + + + + + sh [4975]1.0ms + + + + + + + docker [4977]28.3ms + + + + + + + + sh [4990]1.6ms + + + + + + + + + docker [4991]50.8ms + + + + + + + + sh [8529]1.2ms + + + + + + + docker [8530]10.7ms + + + + + + + + sh [8541]1.2ms + + + + + + + docker [8542]24.2ms + + + + + + + + sh [8553]1.2ms + + + + + + + docker [8554]5.5ms + + + + + + + + sh [8565]1.2ms + + + + + + + docker [8566]12.8ms + + + + + + + + sh [8580]1.1ms + + + + + + + docker [8582]11.1ms + + + + + + + + sh [8596]1.2ms + + + + + + + docker [8597]15.6ms + + + + + + + + sh [8609]1.6ms + + + + + + + docker [8610]13.9ms + + + + + + + + sh [8621]1.3ms + + + + + + + docker [8622]16.9ms + + + + + + + + sh [8634]1.2ms + + + + + + + + + docker [8635]46.4ms + + + + + + + + sh [8696]1.0ms + + + + + + + + + docker [8697]40.7ms + + + + + + + + sh [8730]1.3ms + + + + + + + + + docker [8731]40.2ms + + + + + + + + sh [8770]1.3ms + + + + + + + + + docker [8771]38.7ms + + + + + + + + sh [8805]1.7ms + + + + + + + + + docker [8806]46.1ms + + + + + + + + sh [8897]1.2ms + + + + + + + docker [8899]41.4ms + + + + + + + + sh [9023]1.5ms + + + + + + + + + docker [9024]41.9ms + + + + + + + + sh [9085]1.2ms + + + + + + + + + docker [9086]38.9ms + + + + + + + + sh [9180]1.2ms + + + + + + + + + docker [9182]44.6ms + + + + + + + + sh [11759]1.1ms + + + + + + + + + docker [11760]40.8ms + + + + + + + + sh [11808]1.1ms + + + + + + + + + docker [11809]46.0ms + + + + + + + + sh [11844]1.9ms + + + + + + + + + docker [11845]40.4ms + + + + + + + + sh [11874]1.4ms + + + + + + + docker [11875]42.6ms + + + + + + + + sh [11903]1.1ms + + + + + + + docker [11904]38.9ms + + + + + + + + sh [11948]1.3ms + + + + + + + + + docker [11949]38.9ms + + + + + + + + sh [11996]1.1ms + + + + + + + + + docker [11997]39.5ms + + + + + + + + sh [12042]1.1ms + + + + + + + + + docker [12044]39.7ms + + + + + + + + sh [12090]1.1ms + + + + + + + + + + docker [12091]38.0ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rsyslogd [5029]436.8ms + + + + + + + + + containerd-shim [5038]43.7ms + + + + + + + runc [5053]15.6ms + + + + + + + 7 [5060]5.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + supervisord [5069]574.0ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [5084]339.0ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [5231]415.9ms + + + + + + + + + + + python3 [5232]116.6ms + + + + + + + + + rsyslogd [5312]36.6ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + zebra [5332]297.0ms + + + + + + + bash [5344]7.5ms + + + + + + + timeout [5350]1.3ms + + + + + + + + bash [5351]2.1ms + + + + + + + + + + + + staticd [5987]47.3ms + + + + + + + + + + + + + + + + + bgpd [5993]140.5ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bgpcfgd [6059]280.4ms + + + + + + + + + + + vtysh [6190]83.9ms + + + + + + + + + + + vtysh [6309]98.3ms + + + + + + + + + vtysh [6357]79.1ms + + + + + + + + + + + vtysh [6361]98.2ms + + + + + + + + + + + vtysh [6369]94.3ms + + + + + + + + + + + vtysh [6396]87.0ms + + + + + + + + + + + + bgpmon [6068]97.1ms + + + + + + + sh [6538]2.0ms + + + + + + + + + + + vtysh [6539]95.1ms + + + + + + + + sh [6555]2.0ms + + + + + + + + + + + vtysh [6556]99.0ms + + + + + + + + sh [8231]1.7ms + + + + + + + + + + + vtysh [8232]98.7ms + + + + + + + + sh [9239]2.4ms + + + + + + + + + + + vtysh [9240]112.2ms + + + + + + + + sh [9352]2.4ms + + + + + + + + + + + vtysh [9353]107.4ms + + + + + + + + sh [9970]1.1ms + + + + + + + + + + + vtysh [9971]109.4ms + + + + + + + + sh [11009]1.1ms + + + + + + + + + + + vtysh [11010]102.3ms + + + + + + + + + + + + + vtysh [12128]86.7ms + + + + + + + + sh [13011]1.6ms + + + + + + + + + + + vtysh [13012]114.6ms + + + + + + + + sh [13833]1.4ms + + + + + + + + + + + + vtysh [13834]114.0ms + + + + + + + + fpmsyncd [6071]22.8ms + + + + + + + + runc [5076]4.4ms + + + + + + + runc [9220]15.0ms + + + + + + + + + + + + + + + + + supervisorctl [9230]202.9ms + + + + + + + + runc [12104]11.6ms + + + + + + + + + + + + + + + + + + supervisorctl [12115]187.2ms + + + + + + + + bgp.sh [5088]4.5ms + + + + + + + bgp.sh [5089]3.7ms + + + + + + + + + + + + + + + + + + + + python3 [5090]220.9ms + + + + + + + + start-networkin [5130]10.1ms + + + + + + + + + + + + + python3 [5134]143.2ms + + + + + + + + start-networkin [5152]9.1ms + + + + + + + + + + + + + + python3 [5158]130.4ms + + + + + + + + + + + + + + + + python3 [5166]143.7ms + + + + + + + + + start-networkin [5190]1.2ms + + + + + + + + + + + + + + + + python3 [5191]138.4ms + + + + + + + + + + + + + + swss.sh [5200]24.3ms + + + + + + + + + sonic-db-cli [5201]73.0ms + + + + + + + + + sonic-db-cli [5202]66.4ms + + + + + + + + + + sonic-db-cli [5215]67.5ms + + + + + + + grep [5216]2.9ms + + + + + + + + + + sonic-db-cli [5221]49.3ms + + + + + + + + + sonic-db-cli [5222]46.9ms + + + + + + + + + + + sonic-db-cli [5223]88.1ms + + + + + + + + + sonic-db-cli [5230]60.1ms + + + + + + + + + sonic-db-cli [5233]72.7ms + + + + + + + + + sonic-db-cli [5236]60.5ms + + + + + + + + + sonic-db-cli [5237]70.4ms + + + + + + + + + sonic-db-cli [5238]49.9ms + + + + + + + + + sonic-db-cli [5239]48.2ms + + + + + + + + + + + sonic-db-cli [5240]86.0ms + + + + + + + + + sonic-db-cli [5241]74.6ms + + + + + + + + + sonic-db-cli [5242]67.6ms + + + + + + + swss.sh [5243]10.1ms + + + + + + + + + + + + + + + + + + python3 [5261]198.8ms + + + + + + + docker [5320]53.1ms + + + + + + + + + docker [5353]49.7ms + + + + + + + + + + + + containerd-shim [5279]70.4ms + + + + + + + runc [5290]12.5ms + + + + + + + 7 [5297]5.3ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + supervisord [5300]2.513s + + + + + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [5316]419.7ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [6367]1.952s + + + + + + + + + + + python3 [6368]105.8ms + + + + + + + + + + + rsyslogd [6406]150.5ms + + + + + + + gearsyncd [6418]12.9ms + + + + + + + portsyncd [6419]86.9ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + orchagent [6426]1.130s + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [6427]266.5ms + + + + + + + + + jq [6440]2.3ms + + + + + + + + bash [6450]13.7ms + + + + + + + + + sonic-db-cli [6454]77.6ms + + + + + + + + + sonic-db-cli [6456]73.3ms + + + + + + + + sleep [6460]1.7ms + + + + + + + + + + coppmgrd [6453]28.6ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [6465]506.0ms + + + + + + + neighsyncd [6466]19.5ms + + + + + + + vlanmgrd [6467]31.6ms + + + + + + + sh [6473]1.0ms + + + + + + + + bash [6474]3.8ms + + + + + + + + ip [6497]2.0ms + + + + + + + + intfmgrd [6469]55.8ms + + + + + + + sh [6498]1.3ms + + + + + + + + + + + + + + + + + + + + + + + portmgrd [6470]133.9ms + + + + + + + + + + + + + + + + + + + buffermgrd [6472]109.4ms + + + + + + + redis-cli [6478]3.3ms + + + + + + + + + + + + + + python3 [6477]94.4ms + + + + + + + + + + + + + + + + + + + + + + + python3 [6482]351.6ms + + + + + + + vrfmgrd [6488]28.0ms + + + + + + + nbrmgrd [6490]23.9ms + + + + + + + + + vxlanmgrd [6492]30.2ms + + + + + + + + + + + fdbsyncd [6495]35.2ms + + + + + + + tunnelmgrd [6503]27.2ms + + + + + + + + + + + + + + + + + + + python3 [6540]263.3ms + + + + + + + + + + + + + + + + + + + python3 [6545]264.4ms + + + + + + + + + + + + + + + + + + + python3 [6550]260.4ms + + + + + + + + runc [5333]13.6ms + + + + + + + runc:[2:INIT] [5342]1.3ms + + + + + + + + runc [5368]7.2ms + + + + + + + runc [9096]13.9ms + + + + + + + + + + + + + + + + + supervisorctl [9106]209.7ms + + + + + + + runc [12057]13.6ms + + + + + + + + + + + + + + + + + + supervisorctl [12068]162.0ms + + + + + + + + swss.sh [5395]9.3ms + + + + + + + + + + + sonic-db-cli [5398]95.3ms + + + + + + + + + + + sonic-db-cli [5422]113.5ms + + + + + + + + + sonic-db-cli [5432]79.7ms + + + + + + + + + + + sonic-db-cli [5437]98.9ms + + + + + + + systemctl [5463]2.8ms + + + + + + + systemctl [7196]3.2ms + + + + + + + systemctl [7503]3.4ms + + + + + + + + + docker [7632]51.5ms + + + + + + + + + docker [7660]34.5ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [7702]361.7ms + + + + + + + + syncd.sh [5396]17.1ms + + + + + + + + + + + + sonic-db-cli [5420]102.5ms + + + + + + + sonic-db-cli [5424]4.8ms + + + + + + + + grep [5421]2.0ms + + + + + + + + + + + + sonic-db-cli [5428]96.5ms + + + + + + + + + sonic-db-cli [5433]70.2ms + + + + + + + + + + + sonic-db-cli [5456]92.0ms + + + + + + + + + + + + + + + + + + + + + + + mst [5474]103.7ms + + + + + + + + + + + + + + + + + + + + + + + mst [5878]5.3ms + + + + + + + + mst [5905]1.1ms + + + + + + + + tail [5876]1.3ms + + + + + + + + + + + + + + mlnx-fw-upgrade [6349]8.5ms + + + + + + + + + mlxfwmanager [6356]33.1ms + + + + + + + mlnx-fw-upgrade [6358]1.6ms + + + + + + + lspci [6364]3.5ms + + + + + + + grep [6365]1.3ms + + + + + + + + mlxfwmanager [6366]9.2ms + + + + + + + + sxdkernel [6383]6.7ms + + + + + + + + + + + + + modprobe [6395]132.1ms + + + + + + + + syncd.sh [6732]8.0ms + + + + + + + + + + + + + + + + + + + + python3 [6759]208.6ms + + + + + + + + teamd.sh [5397]10.3ms + + + + + + + + + + + sonic-db-cli [5410]84.3ms + + + + + + + + + sonic-db-cli [5423]66.9ms + + + + + + + + + sonic-db-cli [5430]85.4ms + + + + + + + teamd.sh [5441]7.7ms + + + + + + + + + docker [5445]10.3ms + + + + + + + + + python [5459]1.3ms + + + + + + + + + + + + + + + + + + python3 [5462]204.0ms + + + + + + + + watchdog-contro [5399]6.0ms + + + + + + + + + + + + + + + watchdogutil [5408]164.8ms + + + + + + + + + + + + + + containerd-shim [5609]47.5ms + + + + + + + + + runc [5625]16.3ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + supervisord [5677]538.0ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [6399]373.0ms + + + + + + + + + + + + + + + python3 [6400]113.3ms + + + + + + + rsyslogd [6410]16.6ms + + + + + + + teammgrd [6414]59.3ms + + + + + + + tlm_teamd [6415]22.7ms + + + + + + + teamsyncd [6424]39.3ms + + + + + + + + runc [9049]12.8ms + + + + + + + + + + + + + + + + + supervisorctl [9065]171.2ms + + + + + + + + runc [12010]12.0ms + + + + + + + + + + + + + + + supervisorctl [12021]171.4ms + + + + + + + + teamd.sh [5748]4.7ms + + + + + + + teamd.sh [5752]3.6ms + + + + + + + + + + + + + + + + + + python3 [5757]203.3ms + + + + + + + + + + + + containerd-shim [6812]45.6ms + + + + + + + + + runc [6821]18.5ms + + + + + + + 7 [6861]7.6ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + supervisord [6942]383.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [7729]353.2ms + + + + + + + + + + + + + + + + + + + python3 [7730]171.7ms + + + + + + + + + + + + + + + + + + + + + rsyslogd [8209]262.3ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + syncd [8249]3.608s + + + + + + + + + + + + + + + + + + + sonic-cfggen [8250]241.2ms + + + + + + + sh [8723]1.2ms + + + + + + + sh [8877]1.4ms + + + + + + + sh [8932]1.2ms + + + + + + + + sysctl [8938]1.4ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sx_sdk [8275]12.606s + + + + + + + + + + runc [8923]14.9ms + + + + + + + + + + + + + + + + + supervisorctl [8937]187.4ms + + + + + + + + runc [11962]12.8ms + + + + + + + + + + + + + + + + bash [11974]164.7ms + + + + + + + + syncd.sh [7195]9.5ms + + + + + + + systemctl [7206]2.8ms + + + + + + + systemctl [7371]4.5ms + + + + + + + syncd.sh [7659]5.6ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [7662]322.8ms + + + + + + + + dhcp_relay.sh [7197]12.2ms + + + + + + + + + + + + + sonic-db-cli [7203]127.9ms + + + + + + + + + + + sonic-db-cli [7230]106.9ms + + + + + + + + + + + + + sonic-db-cli [7234]128.5ms + + + + + + + dhcp_relay.sh [7313]8.0ms + + + + + + + + + docker [7322]29.9ms + + + + + + + + dhcp_relay.sh [7351]1.2ms + + + + + + + python [7353]18.7ms + + + + + + + + + + + + + + + + + + + + + + python3 [7386]285.0ms + + + + + + + + radv.sh [7200]10.8ms + + + + + + + + + sonic-db-cli [7209]77.5ms + + + + + + + + + sonic-db-cli [7228]63.9ms + + + + + + + + + + + sonic-db-cli [7233]92.9ms + + + + + + + radv.sh [7243]7.6ms + + + + + + + + + docker [7247]13.8ms + + + + + + + + + python [7265]13.7ms + + + + + + + + + + + + + + + + + + + + python3 [7296]256.2ms + + + + + + + + pmon.sh [7210]8.6ms + + + + + + + + docker [7214]41.6ms + + + + + + + + + python [7226]26.3ms + + + + + + + + + + + + + + + + + + + + + + python3 [7227]257.9ms + + + + + + + + + + + + containerd-shim [7275]45.4ms + + + + + + + runc [7286]11.3ms + + + + + + + 7 [7293]5.1ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + supervisord [7298]668.2ms + + + + + + + platform_wait [7337]6.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [8204]331.7ms + + + + + + + + + + + + + + + + + + + sonic-cfggen [8219]251.8ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [8245]498.7ms + + + + + + + + + + + python3 [8246]123.7ms + + + + + + + rsyslogd [8288]35.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + chassis_db_init [8313]616.3ms + + + + + + + bash [8314]13.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sensors [8320]194.0ms + + + + + + + sensord [8334]6.9ms + + + + + + + + sensord [8338]16.4ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [8315]6.352s + + + + + + + + sh [9359]1.7ms + + + + + + + sh [9361]2.0ms + + + + + + + ethtool [9362]2.7ms + + + + + + + + sh [9367]1.8ms + + + + + + + ethtool [9368]1.3ms + + + + + + + + + sh [9373]1.8ms + + + + + + + ethtool [9374]2.2ms + + + + + + + + sh [9379]2.7ms + + + + + + + ethtool [9380]1.5ms + + + + + + + + sh [9385]3.3ms + + + + + + + sh [9387]2.7ms + + + + + + + ethtool [9388]2.6ms + + + + + + + + sh [9396]1.7ms + + + + + + + sh [9398]2.0ms + + + + + + + ethtool [9399]2.9ms + + + + + + + + sh [9400]1.7ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [9401]875.2ms + + + + + + + + sh [9404]2.4ms + + + + + + + ethtool [9405]2.1ms + + + + + + + + sh [9406]1.9ms + + + + + + + ethtool [9407]4.6ms + + + + + + + + sh [9412]2.0ms + + + + + + + ethtool [9413]2.9ms + + + + + + + + sh [9426]2.0ms + + + + + + + ethtool [9427]2.8ms + + + + + + + + sh [9432]1.7ms + + + + + + + sh [9434]1.7ms + + + + + + + ethtool [9435]2.9ms + + + + + + + + sh [9438]1.7ms + + + + + + + ethtool [9439]1.8ms + + + + + + + + sh [9444]3.9ms + + + + + + + ethtool [9445]1.7ms + + + + + + + + sh [9450]2.1ms + + + + + + + ethtool [9451]2.1ms + + + + + + + + sh [9456]2.1ms + + + + + + + ethtool [9457]2.2ms + + + + + + + + sh [9462]2.2ms + + + + + + + ethtool [9463]2.4ms + + + + + + + + sh [9468]2.2ms + + + + + + + ethtool [9469]2.3ms + + + + + + + + sh [9474]2.2ms + + + + + + + ethtool [9475]2.4ms + + + + + + + + sh [9480]2.2ms + + + + + + + ethtool [9481]2.3ms + + + + + + + + sh [9486]2.3ms + + + + + + + ethtool [9487]2.2ms + + + + + + + + sh [9492]2.2ms + + + + + + + ethtool [9493]2.6ms + + + + + + + + sh [9498]2.0ms + + + + + + + ethtool [9499]2.4ms + + + + + + + + sh [9504]1.9ms + + + + + + + ethtool [9505]2.6ms + + + + + + + + sh [9510]2.1ms + + + + + + + ethtool [9511]2.7ms + + + + + + + + sh [9516]2.2ms + + + + + + + ethtool [9517]2.6ms + + + + + + + + sh [9522]2.2ms + + + + + + + ethtool [9523]2.9ms + + + + + + + + sh [9526]2.2ms + + + + + + + sh [9528]2.3ms + + + + + + + ethtool [9529]2.9ms + + + + + + + + sh [9532]2.2ms + + + + + + + sh [9534]2.3ms + + + + + + + ethtool [9535]2.4ms + + + + + + + + sh [9540]1.9ms + + + + + + + ethtool [9541]2.4ms + + + + + + + + sh [9546]1.8ms + + + + + + + ethtool [9547]2.5ms + + + + + + + + sh [9552]2.2ms + + + + + + + ethtool [9553]2.6ms + + + + + + + + sh [9558]1.9ms + + + + + + + ethtool [9559]2.3ms + + + + + + + + sh [9563]1.8ms + + + + + + + ethtool [9564]3.4ms + + + + + + + + sh [9567]2.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [9568]884.8ms + + + + + + + + sh [9569]4.4ms + + + + + + + ethtool [9570]2.9ms + + + + + + + + sh [9573]1.5ms + + + + + + + ethtool [9574]5.9ms + + + + + + + + sh [9575]1.6ms + + + + + + + ethtool [9576]2.4ms + + + + + + + + sh [9581]2.2ms + + + + + + + ethtool [9582]2.6ms + + + + + + + + sh [9587]2.0ms + + + + + + + ethtool [9588]2.7ms + + + + + + + + sh [9593]1.7ms + + + + + + + ethtool [9594]2.2ms + + + + + + + + sh [9603]2.0ms + + + + + + + ethtool [9604]1.5ms + + + + + + + + sh [9605]1.7ms + + + + + + + ethtool [9606]3.2ms + + + + + + + + sh [9609]1.7ms + + + + + + + ethtool [9610]2.2ms + + + + + + + + sh [9615]2.0ms + + + + + + + ethtool [9616]3.3ms + + + + + + + + sh [9625]2.9ms + + + + + + + sh [9631]1.8ms + + + + + + + ethtool [9632]1.8ms + + + + + + + + sh [9637]1.7ms + + + + + + + ethtool [9638]2.1ms + + + + + + + + sh [9643]2.0ms + + + + + + + ethtool [9644]2.9ms + + + + + + + + sh [9649]1.7ms + + + + + + + ethtool [9650]2.7ms + + + + + + + + sh [9653]3.3ms + + + + + + + sh [9659]2.0ms + + + + + + + sh [9671]3.1ms + + + + + + + ethtool [9672]2.0ms + + + + + + + + sh [9677]1.8ms + + + + + + + ethtool [9678]2.5ms + + + + + + + + sh [9687]1.9ms + + + + + + + ethtool [9688]1.8ms + + + + + + + + sh [9693]2.3ms + + + + + + + ethtool [9694]2.1ms + + + + + + + + sh [9699]1.9ms + + + + + + + ethtool [9700]2.1ms + + + + + + + + sh [9705]1.7ms + + + + + + + ethtool [9706]2.5ms + + + + + + + + sh [9709]1.9ms + + + + + + + sh [9711]1.5ms + + + + + + + ethtool [9712]3.2ms + + + + + + + + sh [9715]2.0ms + + + + + + + ethtool [9716]1.9ms + + + + + + + + sh [9721]2.2ms + + + + + + + ethtool [9722]2.9ms + + + + + + + + sh [9727]1.8ms + + + + + + + + + ethtool [9728]7.0ms + + + + + + + + sh [9733]1.9ms + + + + + + + ethtool [9734]1.9ms + + + + + + + + sh [9739]2.0ms + + + + + + + ethtool [9740]1.8ms + + + + + + + + sh [9745]2.0ms + + + + + + + ethtool [9746]2.1ms + + + + + + + + sh [9757]2.1ms + + + + + + + ethtool [9758]3.0ms + + + + + + + + sh [9763]3.4ms + + + + + + + ethtool [9764]2.3ms + + + + + + + + sh [9777]2.2ms + + + + + + + ethtool [9778]2.4ms + + + + + + + + sh [9785]3.3ms + + + + + + + ethtool [9786]2.5ms + + + + + + + + sh [9793]2.4ms + + + + + + + sh [9799]3.0ms + + + + + + + ethtool [9800]2.5ms + + + + + + + + sh [9807]2.0ms + + + + + + + ethtool [9808]3.6ms + + + + + + + + sh [9813]2.3ms + + + + + + + ethtool [9814]2.3ms + + + + + + + + sh [9819]2.5ms + + + + + + + ethtool [9820]1.6ms + + + + + + + + sh [9825]1.9ms + + + + + + + ethtool [9826]1.8ms + + + + + + + + sh [9827]2.3ms + + + + + + + sh [9831]2.0ms + + + + + + + ethtool [9832]1.6ms + + + + + + + + sh [9833]2.3ms + + + + + + + ethtool [9834]3.1ms + + + + + + + + sh [9837]2.2ms + + + + + + + sh [9839]2.2ms + + + + + + + ethtool [9840]3.2ms + + + + + + + + sh [9845]2.2ms + + + + + + + ethtool [9846]3.7ms + + + + + + + + sh [9851]2.9ms + + + + + + + ethtool [9852]2.2ms + + + + + + + + sh [9863]4.1ms + + + + + + + ethtool [9864]2.4ms + + + + + + + + sh [9869]1.9ms + + + + + + + ethtool [9870]2.6ms + + + + + + + + sh [9875]4.0ms + + + + + + + ethtool [9876]3.3ms + + + + + + + + sh [9884]2.0ms + + + + + + + ethtool [9885]1.5ms + + + + + + + + sh [9886]2.1ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [9887]867.7ms + + + + + + + + sh [9890]3.2ms + + + + + + + ethtool [9891]2.8ms + + + + + + + + sh [9892]1.7ms + + + + + + + ethtool [9893]4.1ms + + + + + + + + sh [9896]2.0ms + + + + + + + ethtool [9897]2.5ms + + + + + + + + sh [9904]2.2ms + + + + + + + ethtool [9905]3.5ms + + + + + + + + sh [9910]2.4ms + + + + + + + ethtool [9911]2.4ms + + + + + + + + sh [9912]1.9ms + + + + + + + ethtool [9913]3.2ms + + + + + + + + sh [9916]3.9ms + + + + + + + sh [9922]1.9ms + + + + + + + ethtool [9923]1.7ms + + + + + + + + sh [9924]2.4ms + + + + + + + + + sh [9928]2.2ms + + + + + + + ethtool [9929]1.9ms + + + + + + + + sh [9940]2.5ms + + + + + + + ethtool [9941]2.3ms + + + + + + + + sh [9946]2.2ms + + + + + + + ethtool [9947]2.3ms + + + + + + + + sh [9958]2.2ms + + + + + + + + + sh [9964]2.1ms + + + + + + + ethtool [9965]2.4ms + + + + + + + + sh [9978]2.0ms + + + + + + + ethtool [9979]2.4ms + + + + + + + + sh [9984]2.1ms + + + + + + + ethtool [9985]2.9ms + + + + + + + + sh [9988]2.7ms + + + + + + + ethtool [9989]1.5ms + + + + + + + + sh [9994]2.2ms + + + + + + + ethtool [9995]2.4ms + + + + + + + + sh [9996]2.8ms + + + + + + + sh [10000]1.9ms + + + + + + + ethtool [10001]1.6ms + + + + + + + + sh [10002]2.3ms + + + + + + + ethtool [10003]3.0ms + + + + + + + + sh [10008]3.1ms + + + + + + + ethtool [10009]3.1ms + + + + + + + + sh [10014]1.9ms + + + + + + + ethtool [10015]2.9ms + + + + + + + + sh [10018]2.1ms + + + + + + + sh [10020]1.9ms + + + + + + + ethtool [10021]3.0ms + + + + + + + + sh [10024]2.0ms + + + + + + + ethtool [10025]1.6ms + + + + + + + + sh [10030]2.2ms + + + + + + + sh [10038]2.3ms + + + + + + + ethtool [10039]3.7ms + + + + + + + + sh [10055]2.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [10056]898.6ms + + + + + + + + sh [10059]2.3ms + + + + + + + ethtool [10060]3.1ms + + + + + + + + sh [10061]2.0ms + + + + + + + ethtool [10062]3.9ms + + + + + + + + sh [10065]2.5ms + + + + + + + ethtool [10066]1.9ms + + + + + + + + sh [10073]1.7ms + + + + + + + ethtool [10074]2.9ms + + + + + + + + sh [10077]1.8ms + + + + + + + sh [10101]2.2ms + + + + + + + sh [10107]2.2ms + + + + + + + ethtool [10108]2.0ms + + + + + + + + sh [10109]2.2ms + + + + + + + sh [10113]2.2ms + + + + + + + sh [10115]2.2ms + + + + + + + ethtool [10116]3.0ms + + + + + + + + sh [10119]2.1ms + + + + + + + sh [10125]2.0ms + + + + + + + ethtool [10126]1.6ms + + + + + + + + sh [10127]1.8ms + + + + + + + + + sh [10131]1.8ms + + + + + + + ethtool [10132]1.8ms + + + + + + + + sh [10137]1.7ms + + + + + + + ethtool [10138]2.4ms + + + + + + + + sh [10143]1.8ms + + + + + + + ethtool [10144]2.7ms + + + + + + + + sh [10147]2.4ms + + + + + + + sh [10153]2.0ms + + + + + + + ethtool [10154]1.5ms + + + + + + + + sh [10155]1.7ms + + + + + + + ethtool [10156]3.1ms + + + + + + + + sh [10159]1.7ms + + + + + + + ethtool [10160]2.1ms + + + + + + + + sh [10165]1.7ms + + + + + + + ethtool [10166]2.5ms + + + + + + + + sh [10171]1.7ms + + + + + + + ethtool [10172]2.8ms + + + + + + + + sh [10175]1.7ms + + + + + + + ethtool [10176]1.4ms + + + + + + + + sh [10181]1.7ms + + + + + + + ethtool [10182]2.0ms + + + + + + + + sh [10187]2.0ms + + + + + + + ethtool [10188]2.4ms + + + + + + + + sh [10191]1.5ms + + + + + + + ethtool [10192]1.2ms + + + + + + + + sh [10193]2.0ms + + + + + + + ethtool [10194]3.0ms + + + + + + + + sh [10197]1.7ms + + + + + + + ethtool [10198]2.3ms + + + + + + + + sh [10203]1.7ms + + + + + + + ethtool [10204]2.5ms + + + + + + + + sh [10209]1.7ms + + + + + + + ethtool [10210]3.4ms + + + + + + + + sh [10218]2.0ms + + + + + + + ethtool [10219]2.8ms + + + + + + + + sh [10220]2.1ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [10221]857.3ms + + + + + + + + sh [10222]2.4ms + + + + + + + ethtool [10223]2.5ms + + + + + + + + sh [10226]2.0ms + + + + + + + ethtool [10227]6.2ms + + + + + + + + sh [10228]1.6ms + + + + + + + sh [10230]2.7ms + + + + + + + ethtool [10231]3.3ms + + + + + + + + sh [10236]2.1ms + + + + + + + ethtool [10237]1.8ms + + + + + + + + sh [10242]2.2ms + + + + + + + + sh [10250]2.2ms + + + + + + + ethtool [10251]3.1ms + + + + + + + + sh [10256]2.2ms + + + + + + + ethtool [10257]3.4ms + + + + + + + + sh [10262]2.2ms + + + + + + + ethtool [10263]2.4ms + + + + + + + + sh [10268]2.1ms + + + + + + + ethtool [10269]3.0ms + + + + + + + + sh [10274]2.1ms + + + + + + + ethtool [10275]2.8ms + + + + + + + + + sh [10286]1.6ms + + + + + + + ethtool [10287]2.6ms + + + + + + + + sh [10292]2.4ms + + + + + + + ethtool [10293]2.4ms + + + + + + + + sh [10298]2.0ms + + + + + + + ethtool [10299]1.7ms + + + + + + + + sh [10304]2.0ms + + + + + + + + + sh [10310]1.7ms + + + + + + + ethtool [10311]3.1ms + + + + + + + + sh [10314]2.0ms + + + + + + + sh [10316]2.5ms + + + + + + + ethtool [10317]2.8ms + + + + + + + + sh [10320]1.7ms + + + + + + + ethtool [10321]2.2ms + + + + + + + + sh [10322]2.0ms + + + + + + + ethtool [10323]3.2ms + + + + + + + + sh [10326]2.0ms + + + + + + + ethtool [10327]1.8ms + + + + + + + + sh [10332]2.0ms + + + + + + + ethtool [10333]2.3ms + + + + + + + + sh [10344]2.1ms + + + + + + + ethtool [10345]3.0ms + + + + + + + + sh [10350]2.1ms + + + + + + + ethtool [10351]2.4ms + + + + + + + + sh [10358]2.3ms + + + + + + + + + sh [10364]2.1ms + + + + + + + ethtool [10365]3.3ms + + + + + + + + sh [10370]1.9ms + + + + + + + ethtool [10371]2.2ms + + + + + + + + sh [10376]1.9ms + + + + + + + ethtool [10377]2.5ms + + + + + + + + sh [10385]2.0ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [10386]892.1ms + + + + + + + + sh [10391]1.6ms + + + + + + + ethtool [10392]4.4ms + + + + + + + + sh [10395]1.5ms + + + + + + + sh [10409]2.0ms + + + + + + + + + sh [10415]1.7ms + + + + + + + ethtool [10416]2.6ms + + + + + + + + sh [10419]2.0ms + + + + + + + sh [10425]2.1ms + + + + + + + ethtool [10426]2.3ms + + + + + + + + sh [10431]3.3ms + + + + + + + ethtool [10432]1.6ms + + + + + + + + sh [10433]1.8ms + + + + + + + sh [10437]2.0ms + + + + + + + ethtool [10438]1.9ms + + + + + + + + sh [10443]1.7ms + + + + + + + ethtool [10444]2.5ms + + + + + + + + sh [10449]2.1ms + + + + + + + ethtool [10450]2.6ms + + + + + + + + sh [10453]2.2ms + + + + + + + sh [10455]3.3ms + + + + + + + ethtool [10456]2.9ms + + + + + + + + sh [10461]2.2ms + + + + + + + ethtool [10462]2.7ms + + + + + + + + sh [10465]2.1ms + + + + + + + sh [10467]1.8ms + + + + + + + ethtool [10468]3.0ms + + + + + + + + sh [10471]1.9ms + + + + + + + ethtool [10472]1.8ms + + + + + + + + sh [10477]2.3ms + + + + + + + ethtool [10478]2.6ms + + + + + + + + sh [10487]2.1ms + + + + + + + ethtool [10488]2.1ms + + + + + + + + sh [10489]2.6ms + + + + + + + ethtool [10490]3.1ms + + + + + + + + sh [10493]1.7ms + + + + + + + ethtool [10494]1.7ms + + + + + + + + sh [10508]2.4ms + + + + + + + ethtool [10509]2.8ms + + + + + + + + sh [10517]1.9ms + + + + + + + sh [10519]1.8ms + + + + + + + ethtool [10520]2.7ms + + + + + + + + sh [10525]1.9ms + + + + + + + ethtool [10526]2.4ms + + + + + + + + sh [10540]1.8ms + + + + + + + ethtool [10541]2.1ms + + + + + + + + sh [10553]1.7ms + + + + + + + ethtool [10554]2.6ms + + + + + + + + sh [10573]1.7ms + + + + + + + ethtool [10574]2.5ms + + + + + + + + sh [10577]1.7ms + + + + + + + sh [10579]1.6ms + + + + + + + ethtool [10580]2.6ms + + + + + + + + sh [10586]1.8ms + + + + + + + sh [10588]1.6ms + + + + + + + ethtool [10589]2.9ms + + + + + + + + sh [10593]1.8ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [10594]899.1ms + + + + + + + + sh [10669]1.6ms + + + + + + + + + ethtool [10670]7.6ms + + + + + + + + sh [10684]1.6ms + + + + + + + ethtool [10685]2.0ms + + + + + + + + sh [10699]1.6ms + + + + + + + ethtool [10700]2.5ms + + + + + + + + sh [10709]1.6ms + + + + + + + ethtool [10710]1.6ms + + + + + + + + sh [10733]1.6ms + + + + + + + ethtool [10734]1.5ms + + + + + + + + sh [10739]1.5ms + + + + + + + ethtool [10740]2.1ms + + + + + + + + sh [10743]1.6ms + + + + + + + ethtool [10744]1.2ms + + + + + + + + + sh [10751]1.6ms + + + + + + + ethtool [10752]2.4ms + + + + + + + + sh [10772]1.7ms + + + + + + + ethtool [10773]2.2ms + + + + + + + + sh [10776]1.6ms + + + + + + + sh [10778]1.5ms + + + + + + + ethtool [10779]2.6ms + + + + + + + + sh [10782]1.6ms + + + + + + + ethtool [10783]1.7ms + + + + + + + + sh [10790]1.6ms + + + + + + + ethtool [10791]2.2ms + + + + + + + + sh [10810]1.7ms + + + + + + + ethtool [10812]1.1ms + + + + + + + + sh [10820]1.7ms + + + + + + + sh [10824]1.6ms + + + + + + + ethtool [10825]1.7ms + + + + + + + + + sh [10834]1.7ms + + + + + + + ethtool [10835]1.4ms + + + + + + + + sh [10840]1.5ms + + + + + + + ethtool [10841]2.5ms + + + + + + + + sh [10844]1.9ms + + + + + + + sh [10846]2.5ms + + + + + + + ethtool [10847]2.5ms + + + + + + + + sh [10850]1.5ms + + + + + + + ethtool [10851]2.1ms + + + + + + + + sh [10856]1.7ms + + + + + + + ethtool [10857]2.4ms + + + + + + + + sh [10860]1.5ms + + + + + + + ethtool [10861]1.3ms + + + + + + + + sh [10866]1.6ms + + + + + + + ethtool [10867]1.8ms + + + + + + + + sh [10872]1.5ms + + + + + + + ethtool [10873]2.5ms + + + + + + + + sh [10876]1.5ms + + + + + + + ethtool [10877]1.8ms + + + + + + + + sh [10886]1.6ms + + + + + + + ethtool [10887]2.1ms + + + + + + + + sh [10892]1.7ms + + + + + + + ethtool [10893]3.0ms + + + + + + + + sh [10896]1.6ms + + + + + + + ethtool [10897]1.3ms + + + + + + + + + sh [10902]1.8ms + + + + + + + ethtool [10903]1.6ms + + + + + + + + sh [10909]1.7ms + + + + + + + ethtool [10910]1.9ms + + + + + + + + sh [10919]1.7ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [10920]844.6ms + + + + + + + + sh [10940]2.8ms + + + + + + + sh [10942]1.6ms + + + + + + + + + ethtool [10943]8.0ms + + + + + + + + sh [10948]2.1ms + + + + + + + ethtool [10949]2.7ms + + + + + + + + sh [10956]2.3ms + + + + + + + ethtool [10957]3.0ms + + + + + + + + sh [10960]1.8ms + + + + + + + ethtool [10961]1.5ms + + + + + + + + sh [10962]2.2ms + + + + + + + ethtool [10963]3.3ms + + + + + + + + sh [10966]2.0ms + + + + + + + ethtool [10967]2.0ms + + + + + + + + sh [10968]2.0ms + + + + + + + ethtool [10969]3.4ms + + + + + + + + sh [10972]2.0ms + + + + + + + ethtool [10973]2.4ms + + + + + + + + sh [10978]1.8ms + + + + + + + ethtool [10979]2.1ms + + + + + + + + sh [10984]2.2ms + + + + + + + ethtool [10985]2.4ms + + + + + + + + sh [10990]2.0ms + + + + + + + ethtool [10991]2.9ms + + + + + + + + sh [10996]1.9ms + + + + + + + ethtool [10997]2.9ms + + + + + + + + sh [11000]1.9ms + + + + + + + ethtool [11001]1.5ms + + + + + + + + sh [11002]2.1ms + + + + + + + ethtool [11003]3.2ms + + + + + + + + sh [11006]2.1ms + + + + + + + ethtool [11007]1.8ms + + + + + + + + sh [11014]2.1ms + + + + + + + ethtool [11015]2.1ms + + + + + + + + sh [11020]1.7ms + + + + + + + sh [11024]2.2ms + + + + + + + sh [11026]3.8ms + + + + + + + ethtool [11027]2.6ms + + + + + + + + sh [11030]1.5ms + + + + + + + ethtool [11031]2.1ms + + + + + + + + sh [11032]2.1ms + + + + + + + ethtool [11033]3.3ms + + + + + + + + sh [11036]2.1ms + + + + + + + ethtool [11037]2.2ms + + + + + + + + sh [11042]2.0ms + + + + + + + ethtool [11043]2.2ms + + + + + + + + sh [11048]2.1ms + + + + + + + ethtool [11049]2.9ms + + + + + + + + sh [11054]2.2ms + + + + + + + ethtool [11055]2.7ms + + + + + + + + sh [11060]2.1ms + + + + + + + sh [11066]3.2ms + + + + + + + ethtool [11067]3.2ms + + + + + + + + sh [11072]2.2ms + + + + + + + ethtool [11073]2.5ms + + + + + + + + sh [11078]2.3ms + + + + + + + ethtool [11079]2.5ms + + + + + + + + + sh [11090]1.9ms + + + + + + + ethtool [11091]3.2ms + + + + + + + + sh [11094]2.3ms + + + + + + + sh [11099]2.1ms + + + + + + + ethtool [11100]2.3ms + + + + + + + + sh [11103]2.0ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [11104]877.6ms + + + + + + + + sh [11107]2.7ms + + + + + + + sh [11109]2.1ms + + + + + + + ethtool [11110]7.8ms + + + + + + + + sh [11117]2.1ms + + + + + + + + + sh [11123]2.3ms + + + + + + + ethtool [11124]3.4ms + + + + + + + + sh [11125]4.0ms + + + + + + + ethtool [11126]3.2ms + + + + + + + + sh [11129]2.7ms + + + + + + + sh [11131]2.3ms + + + + + + + ethtool [11132]3.2ms + + + + + + + + sh [11135]3.0ms + + + + + + + sh [11137]2.3ms + + + + + + + ethtool [11138]3.1ms + + + + + + + + sh [11141]2.3ms + + + + + + + sh [11143]2.3ms + + + + + + + sh [11149]2.3ms + + + + + + + ethtool [11150]2.7ms + + + + + + + + sh [11151]2.7ms + + + + + + + + + sh [11155]2.1ms + + + + + + + ethtool [11156]2.7ms + + + + + + + + sh [11161]2.2ms + + + + + + + ethtool [11162]1.9ms + + + + + + + + sh [11163]2.2ms + + + + + + + ethtool [11164]3.4ms + + + + + + + + sh [11167]2.2ms + + + + + + + ethtool [11168]1.7ms + + + + + + + + sh [11173]1.8ms + + + + + + + ethtool [11174]2.5ms + + + + + + + + sh [11179]2.1ms + + + + + + + ethtool [11180]2.4ms + + + + + + + + sh [11185]2.1ms + + + + + + + ethtool [11186]2.4ms + + + + + + + + sh [11189]2.2ms + + + + + + + sh [11191]2.2ms + + + + + + + ethtool [11192]3.0ms + + + + + + + + sh [11195]2.2ms + + + + + + + ethtool [11196]2.1ms + + + + + + + + sh [11197]2.2ms + + + + + + + ethtool [11198]3.3ms + + + + + + + + sh [11201]2.2ms + + + + + + + ethtool [11202]1.6ms + + + + + + + + sh [11203]2.0ms + + + + + + + sh [11207]2.3ms + + + + + + + ethtool [11208]1.8ms + + + + + + + + sh [11213]2.2ms + + + + + + + ethtool [11214]2.7ms + + + + + + + + sh [11219]2.3ms + + + + + + + ethtool [11220]2.4ms + + + + + + + + sh [11225]2.3ms + + + + + + + ethtool [11226]2.3ms + + + + + + + + sh [11231]2.2ms + + + + + + + ethtool [11232]2.5ms + + + + + + + + sh [11237]2.3ms + + + + + + + sh [11243]2.5ms + + + + + + + sh [11251]2.0ms + + + + + + + ethtool [11252]2.9ms + + + + + + + + sh [11253]2.1ms + + + + + + + ethtool [11254]3.5ms + + + + + + + + sh [11255]2.3ms + + + + + + + ethtool [11256]2.5ms + + + + + + + + sh [11257]2.0ms + + + + + + + ethtool [11258]1.9ms + + + + + + + + sh [11259]1.9ms + + + + + + + ethtool [11260]1.6ms + + + + + + + + sh [11264]2.0ms + + + + + + + ethtool [11265]2.8ms + + + + + + + + sh [11266]3.5ms + + + + + + + ethtool [11267]2.2ms + + + + + + + + sh [11268]2.3ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [11269]915.0ms + + + + + + + + sh [11274]3.4ms + + + + + + + ethtool [11275]2.5ms + + + + + + + + sh [11278]2.0ms + + + + + + + ethtool [11279]4.9ms + + + + + + + + sh [11280]2.0ms + + + + + + + sh [11282]2.0ms + + + + + + + ethtool [11283]2.7ms + + + + + + + + sh [11288]2.0ms + + + + + + + + + + sh [11300]2.2ms + + + + + + + ethtool [11301]2.6ms + + + + + + + + sh [11304]1.8ms + + + + + + + sh [11306]1.8ms + + + + + + + ethtool [11307]3.8ms + + + + + + + + sh [11310]2.1ms + + + + + + + ethtool [11311]1.5ms + + + + + + + + sh [11318]1.8ms + + + + + + + ethtool [11319]2.3ms + + + + + + + + sh [11320]1.8ms + + + + + + + + + sh [11324]2.0ms + + + + + + + ethtool [11325]1.7ms + + + + + + + + sh [11330]1.7ms + + + + + + + ethtool [11331]2.5ms + + + + + + + + sh [11340]1.9ms + + + + + + + ethtool [11341]1.5ms + + + + + + + + sh [11342]2.1ms + + + + + + + ethtool [11343]3.2ms + + + + + + + + sh [11346]2.1ms + + + + + + + ethtool [11347]2.0ms + + + + + + + + sh [11348]2.1ms + + + + + + + + + sh [11352]2.2ms + + + + + + + ethtool [11353]1.8ms + + + + + + + + sh [11358]2.0ms + + + + + + + ethtool [11359]2.2ms + + + + + + + + sh [11364]2.3ms + + + + + + + ethtool [11365]2.7ms + + + + + + + + sh [11370]2.9ms + + + + + + + ethtool [11371]2.2ms + + + + + + + + sh [11376]1.9ms + + + + + + + ethtool [11377]2.0ms + + + + + + + + sh [11382]2.1ms + + + + + + + ethtool [11383]2.3ms + + + + + + + + sh [11388]2.1ms + + + + + + + + + sh [11394]2.2ms + + + + + + + ethtool [11395]3.1ms + + + + + + + + + sh [11402]3.2ms + + + + + + + ethtool [11403]2.6ms + + + + + + + + sh [11404]2.3ms + + + + + + + ethtool [11405]2.3ms + + + + + + + + sh [11412]2.8ms + + + + + + + ethtool [11413]1.8ms + + + + + + + + sh [11414]2.3ms + + + + + + + ethtool [11415]2.5ms + + + + + + + + sh [11420]2.2ms + + + + + + + ethtool [11421]3.2ms + + + + + + + + sh [11426]2.2ms + + + + + + + ethtool [11427]2.8ms + + + + + + + + sh [11435]2.1ms + + + + + + + ethtool [11436]2.3ms + + + + + + + + sh [11439]2.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [11440]877.7ms + + + + + + + + sh [11443]2.4ms + + + + + + + sh [11445]1.9ms + + + + + + + ethtool [11446]3.0ms + + + + + + + + sh [11451]2.5ms + + + + + + + ethtool [11452]3.5ms + + + + + + + + sh [11457]3.2ms + + + + + + + ethtool [11458]1.7ms + + + + + + + + sh [11463]2.5ms + + + + + + + ethtool [11464]2.1ms + + + + + + + + sh [11465]2.3ms + + + + + + + ethtool [11466]3.4ms + + + + + + + + sh [11469]1.9ms + + + + + + + ethtool [11470]1.6ms + + + + + + + + sh [11471]2.2ms + + + + + + + ethtool [11472]3.3ms + + + + + + + + sh [11475]2.1ms + + + + + + + ethtool [11476]1.9ms + + + + + + + + sh [11481]2.0ms + + + + + + + ethtool [11482]1.9ms + + + + + + + + sh [11483]2.1ms + + + + + + + ethtool [11484]2.4ms + + + + + + + + sh [11485]2.0ms + + + + + + + ethtool [11486]3.3ms + + + + + + + + sh [11491]2.2ms + + + + + + + sh [11493]2.1ms + + + + + + + ethtool [11494]2.1ms + + + + + + + + sh [11495]2.1ms + + + + + + + ethtool [11496]3.1ms + + + + + + + + sh [11501]2.2ms + + + + + + + ethtool [11502]3.3ms + + + + + + + + sh [11507]1.9ms + + + + + + + ethtool [11508]3.2ms + + + + + + + + sh [11519]2.7ms + + + + + + + ethtool [11520]3.0ms + + + + + + + + sh [11523]2.3ms + + + + + + + sh [11525]2.1ms + + + + + + + ethtool [11526]2.9ms + + + + + + + + sh [11529]2.0ms + + + + + + + sh [11535]2.1ms + + + + + + + sh [11537]2.2ms + + + + + + + ethtool [11538]3.2ms + + + + + + + + sh [11541]2.0ms + + + + + + + ethtool [11542]1.5ms + + + + + + + + sh [11543]2.2ms + + + + + + + ethtool [11544]3.3ms + + + + + + + + sh [11547]2.3ms + + + + + + + ethtool [11548]1.8ms + + + + + + + + sh [11553]2.0ms + + + + + + + ethtool [11554]2.2ms + + + + + + + + sh [11559]2.2ms + + + + + + + ethtool [11560]2.3ms + + + + + + + + sh [11565]2.0ms + + + + + + + ethtool [11566]2.8ms + + + + + + + + sh [11571]2.0ms + + + + + + + ethtool [11572]2.6ms + + + + + + + + sh [11573]2.4ms + + + + + + + + + sh [11577]2.0ms + + + + + + + ethtool [11578]1.5ms + + + + + + + + sh [11579]2.0ms + + + + + + + ethtool [11580]3.0ms + + + + + + + + sh [11583]1.9ms + + + + + + + sh [11589]2.0ms + + + + + + + ethtool [11590]1.5ms + + + + + + + + sh [11591]2.0ms + + + + + + + + + sh [11602]2.6ms + + + + + + + ethtool [11608]1.6ms + + + + + + + + sh [11616]2.0ms + + + + + + + ethtool [11617]2.9ms + + + + + + + + sh [11618]1.8ms + + + + + + + ethtool [11619]4.7ms + + + + + + + + sh [11620]3.5ms + + + + + + + sh [11622]1.8ms + + + + + + + ethtool [11623]3.1ms + + + + + + + + sh [11628]2.0ms + + + + + + + ethtool [11629]2.6ms + + + + + + + + sh [11634]2.0ms + + + + + + + ethtool [11635]2.9ms + + + + + + + + sh [11638]1.9ms + + + + + + + ethtool [11639]2.1ms + + + + + + + + sh [11644]2.1ms + + + + + + + + sh [11658]2.3ms + + + + + + + ethtool [11659]2.7ms + + + + + + + + sh [11664]2.3ms + + + + + + + sh [11678]2.3ms + + + + + + + sh [11686]2.4ms + + + + + + + ethtool [11687]3.3ms + + + + + + + + sh [11692]1.9ms + + + + + + + ethtool [11693]2.7ms + + + + + + + + sh [11696]2.0ms + + + + + + + sh [11698]2.0ms + + + + + + + ethtool [11699]3.0ms + + + + + + + + sh [11702]2.2ms + + + + + + + ethtool [11703]1.8ms + + + + + + + + sh [11704]2.0ms + + + + + + + ethtool [11705]3.2ms + + + + + + + + sh [11708]2.3ms + + + + + + + ethtool [11709]2.4ms + + + + + + + + sh [11710]2.3ms + + + + + + + + + sh [11714]2.3ms + + + + + + + ethtool [11715]1.9ms + + + + + + + + sh [11720]2.1ms + + + + + + + ethtool [11721]2.1ms + + + + + + + + sh [11726]2.0ms + + + + + + + ethtool [11727]2.7ms + + + + + + + + sh [11732]2.2ms + + + + + + + ethtool [11733]2.3ms + + + + + + + + sh [11738]2.4ms + + + + + + + ethtool [11739]2.5ms + + + + + + + + sh [11748]2.1ms + + + + + + + ethtool [11749]2.8ms + + + + + + + + sh [11774]2.0ms + + + + + + + ethtool [11776]2.7ms + + + + + + + + sh [11781]1.6ms + + + + + + + ethtool [11782]3.4ms + + + + + + + + sh [11792]1.8ms + + + + + + + ethtool [11793]2.8ms + + + + + + + + sh [11796]1.7ms + + + + + + + ethtool [11797]1.6ms + + + + + + + + sh [11802]2.4ms + + + + + + + ethtool [11803]2.2ms + + + + + + + + sh [11818]1.9ms + + + + + + + ethtool [11819]1.7ms + + + + + + + + sh [11825]2.0ms + + + + + + + ethtool [11826]3.2ms + + + + + + + + sh [11842]1.8ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [11843]885.2ms + + + + + + + + sh [11901]4.0ms + + + + + + + ethtool [11902]3.4ms + + + + + + + + sh [11918]2.0ms + + + + + + + ethtool [11919]5.8ms + + + + + + + + sh [11934]1.7ms + + + + + + + ethtool [11935]2.0ms + + + + + + + + sh [11940]1.7ms + + + + + + + ethtool [11941]1.8ms + + + + + + + + sh [11946]1.8ms + + + + + + + ethtool [11947]2.7ms + + + + + + + + sh [11968]2.1ms + + + + + + + sh [11982]1.8ms + + + + + + + ethtool [11983]2.6ms + + + + + + + + sh [11986]2.1ms + + + + + + + ethtool [11987]1.4ms + + + + + + + + sh [11988]1.7ms + + + + + + + + + sh [11992]1.7ms + + + + + + + ethtool [11993]1.8ms + + + + + + + + sh [12011]1.8ms + + + + + + + ethtool [12017]2.1ms + + + + + + + + sh [12027]1.8ms + + + + + + + ethtool [12028]1.5ms + + + + + + + + sh [12029]1.7ms + + + + + + + ethtool [12030]3.0ms + + + + + + + + sh [12033]1.6ms + + + + + + + ethtool [12034]1.6ms + + + + + + + + sh [12039]1.6ms + + + + + + + ethtool [12040]2.6ms + + + + + + + + sh [12065]1.9ms + + + + + + + ethtool [12066]2.7ms + + + + + + + + sh [12076]1.7ms + + + + + + + ethtool [12077]2.2ms + + + + + + + + sh [12080]1.7ms + + + + + + + ethtool [12081]1.3ms + + + + + + + + sh [12086]1.6ms + + + + + + + ethtool [12087]1.7ms + + + + + + + + sh [12112]1.8ms + + + + + + + ethtool [12113]2.4ms + + + + + + + + sh [12125]1.6ms + + + + + + + ethtool [12126]2.4ms + + + + + + + + sh [12131]1.7ms + + + + + + + sh [12133]1.7ms + + + + + + + + + sh [12137]1.6ms + + + + + + + ethtool [12138]1.7ms + + + + + + + + sh [12143]1.8ms + + + + + + + ethtool [12144]2.1ms + + + + + + + + sh [12149]1.7ms + + + + + + + ethtool [12150]3.0ms + + + + + + + + sh [12153]2.1ms + + + + + + + sh [12159]1.6ms + + + + + + + ethtool [12160]1.8ms + + + + + + + + sh [12165]1.5ms + + + + + + + ethtool [12166]1.9ms + + + + + + + + sh [12171]1.6ms + + + + + + + ethtool [12172]2.1ms + + + + + + + + sh [12179]2.1ms + + + + + + + + + sh [12191]2.3ms + + + + + + + ethtool [12192]3.2ms + + + + + + + + sh [12204]2.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [12205]882.6ms + + + + + + + + sh [12210]2.1ms + + + + + + + ethtool [12211]7.6ms + + + + + + + + sh [12212]2.3ms + + + + + + + ethtool [12213]2.7ms + + + + + + + + sh [12220]1.9ms + + + + + + + + + sh [12226]1.9ms + + + + + + + + + sh [12232]2.1ms + + + + + + + ethtool [12233]2.9ms + + + + + + + + sh [12238]2.4ms + + + + + + + ethtool [12239]3.2ms + + + + + + + + sh [12244]2.3ms + + + + + + + sh [12250]2.3ms + + + + + + + ethtool [12251]3.0ms + + + + + + + + sh [12256]2.3ms + + + + + + + ethtool [12257]3.3ms + + + + + + + + sh [12260]2.2ms + + + + + + + sh [12266]2.2ms + + + + + + + sh [12272]1.6ms + + + + + + + ethtool [12273]2.1ms + + + + + + + + sh [12278]2.0ms + + + + + + + ethtool [12279]2.1ms + + + + + + + + sh [12284]2.1ms + + + + + + + sh [12288]2.1ms + + + + + + + sh [12290]3.5ms + + + + + + + ethtool [12291]2.7ms + + + + + + + + sh [12296]2.3ms + + + + + + + ethtool [12297]2.8ms + + + + + + + + sh [12302]2.4ms + + + + + + + ethtool [12303]2.9ms + + + + + + + + sh [12308]2.2ms + + + + + + + ethtool [12309]3.1ms + + + + + + + + sh [12314]2.3ms + + + + + + + + + sh [12320]2.3ms + + + + + + + ethtool [12321]3.2ms + + + + + + + + sh [12326]2.2ms + + + + + + + + + sh [12332]2.0ms + + + + + + + ethtool [12333]3.4ms + + + + + + + + sh [12338]3.1ms + + + + + + + ethtool [12339]2.7ms + + + + + + + + sh [12344]2.2ms + + + + + + + ethtool [12345]2.8ms + + + + + + + + sh [12348]2.3ms + + + + + + + sh [12350]2.3ms + + + + + + + ethtool [12351]3.2ms + + + + + + + + sh [12354]2.5ms + + + + + + + sh [12356]2.3ms + + + + + + + ethtool [12357]3.3ms + + + + + + + + sh [12360]2.2ms + + + + + + + ethtool [12361]1.6ms + + + + + + + + sh [12362]2.0ms + + + + + + + ethtool [12363]3.3ms + + + + + + + + sh [12364]2.3ms + + + + + + + ethtool [12365]4.8ms + + + + + + + + sh [12374]3.9ms + + + + + + + sh [12376]2.3ms + + + + + + + + + sh [12382]2.4ms + + + + + + + + sh [12388]2.1ms + + + + + + + sh [12390]2.1ms + + + + + + + ethtool [12391]3.1ms + + + + + + + + sh [12394]1.7ms + + + + + + + ethtool [12395]1.6ms + + + + + + + + sh [12396]2.2ms + + + + + + + ethtool [12397]3.4ms + + + + + + + + sh [12400]2.2ms + + + + + + + ethtool [12401]1.7ms + + + + + + + + sh [12406]2.2ms + + + + + + + ethtool [12407]1.7ms + + + + + + + + sh [12408]2.1ms + + + + + + + + + sh [12412]2.1ms + + + + + + + ethtool [12413]1.9ms + + + + + + + + sh [12418]1.9ms + + + + + + + + + sh [12424]2.6ms + + + + + + + ethtool [12425]2.4ms + + + + + + + + sh [12426]2.4ms + + + + + + + ethtool [12427]3.9ms + + + + + + + + + sh [12438]2.3ms + + + + + + + ethtool [12439]3.1ms + + + + + + + + sh [12444]2.2ms + + + + + + + + + sh [12450]2.0ms + + + + + + + ethtool [12451]2.7ms + + + + + + + + sh [12456]2.8ms + + + + + + + + + sh [12462]2.5ms + + + + + + + ethtool [12463]2.9ms + + + + + + + + sh [12466]2.3ms + + + + + + + sh [12468]2.3ms + + + + + + + ethtool [12469]3.1ms + + + + + + + + sh [12472]2.0ms + + + + + + + sh [12478]2.1ms + + + + + + + ethtool [12479]2.8ms + + + + + + + + sh [12480]2.6ms + + + + + + + ethtool [12481]3.4ms + + + + + + + + sh [12484]2.3ms + + + + + + + ethtool [12485]1.6ms + + + + + + + + + sh [12490]2.2ms + + + + + + + ethtool [12491]1.6ms + + + + + + + + sh [12496]2.0ms + + + + + + + ethtool [12497]1.8ms + + + + + + + + + sh [12502]2.0ms + + + + + + + ethtool [12503]1.9ms + + + + + + + + sh [12508]1.9ms + + + + + + + ethtool [12509]2.2ms + + + + + + + + sh [12514]1.9ms + + + + + + + ethtool [12515]2.2ms + + + + + + + + sh [12519]2.2ms + + + + + + + ethtool [12520]3.1ms + + + + + + + + sh [12523]2.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [12524]921.9ms + + + + + + + + sh [12529]2.1ms + + + + + + + + + ethtool [12530]6.8ms + + + + + + + + sh [12537]2.8ms + + + + + + + ethtool [12538]1.6ms + + + + + + + + sh [12539]2.1ms + + + + + + + ethtool [12540]3.0ms + + + + + + + + sh [12543]2.1ms + + + + + + + ethtool [12544]2.0ms + + + + + + + + sh [12561]2.1ms + + + + + + + ethtool [12562]1.7ms + + + + + + + + sh [12567]2.6ms + + + + + + + ethtool [12568]2.8ms + + + + + + + + sh [12573]2.1ms + + + + + + + ethtool [12574]2.1ms + + + + + + + + + sh [12579]1.8ms + + + + + + + ethtool [12580]1.8ms + + + + + + + + sh [12585]2.0ms + + + + + + + ethtool [12586]2.4ms + + + + + + + + sh [12591]2.0ms + + + + + + + ethtool [12592]2.2ms + + + + + + + + sh [12597]2.5ms + + + + + + + ethtool [12598]2.4ms + + + + + + + + sh [12619]3.2ms + + + + + + + sh [12625]2.1ms + + + + + + + ethtool [12626]1.6ms + + + + + + + + sh [12627]2.2ms + + + + + + + ethtool [12628]3.8ms + + + + + + + + sh [12631]2.1ms + + + + + + + ethtool [12632]1.7ms + + + + + + + + + sh [12637]3.1ms + + + + + + + ethtool [12638]1.6ms + + + + + + + + sh [12643]1.9ms + + + + + + + ethtool [12644]2.1ms + + + + + + + + sh [12649]2.0ms + + + + + + + ethtool [12650]3.2ms + + + + + + + + sh [12665]2.0ms + + + + + + + ethtool [12666]2.4ms + + + + + + + + sh [12667]3.4ms + + + + + + + ethtool [12668]3.1ms + + + + + + + + sh [12671]2.2ms + + + + + + + ethtool [12672]1.7ms + + + + + + + + sh [12677]2.7ms + + + + + + + ethtool [12678]2.2ms + + + + + + + + sh [12679]2.3ms + + + + + + + ethtool [12680]3.4ms + + + + + + + + sh [12683]2.3ms + + + + + + + + + ethtool [12684]6.9ms + + + + + + + + sh [12685]2.7ms + + + + + + + + + sh [12697]2.2ms + + + + + + + ethtool [12698]3.0ms + + + + + + + + sh [12703]2.1ms + + + + + + + ethtool [12704]2.6ms + + + + + + + + sh [12709]2.4ms + + + + + + + ethtool [12710]2.9ms + + + + + + + + sh [12715]2.2ms + + + + + + + ethtool [12716]2.4ms + + + + + + + + sh [12721]2.1ms + + + + + + + ethtool [12722]3.1ms + + + + + + + + sh [12727]2.5ms + + + + + + + ethtool [12728]2.7ms + + + + + + + + sh [12733]2.3ms + + + + + + + ethtool [12734]2.2ms + + + + + + + + sh [12739]2.3ms + + + + + + + ethtool [12740]2.2ms + + + + + + + + sh [12745]2.3ms + + + + + + + ethtool [12746]2.8ms + + + + + + + + sh [12751]2.1ms + + + + + + + ethtool [12752]1.9ms + + + + + + + + sh [12757]1.9ms + + + + + + + ethtool [12758]2.2ms + + + + + + + + sh [12759]2.0ms + + + + + + + ethtool [12760]3.6ms + + + + + + + + sh [12763]2.0ms + + + + + + + ethtool [12764]2.2ms + + + + + + + + sh [12765]2.2ms + + + + + + + sh [12769]2.0ms + + + + + + + ethtool [12770]2.1ms + + + + + + + + sh [12775]2.0ms + + + + + + + ethtool [12776]2.3ms + + + + + + + + sh [12781]3.4ms + + + + + + + ethtool [12782]2.9ms + + + + + + + + sh [12787]2.2ms + + + + + + + ethtool [12788]2.1ms + + + + + + + + sh [12793]2.3ms + + + + + + + ethtool [12794]2.8ms + + + + + + + + sh [12799]2.3ms + + + + + + + ethtool [12800]2.7ms + + + + + + + + sh [12805]1.9ms + + + + + + + ethtool [12806]3.1ms + + + + + + + + sh [12813]1.9ms + + + + + + + ethtool [12814]2.4ms + + + + + + + + sh [12817]2.1ms + + + + + + + sh [12823]1.9ms + + + + + + + sh [12829]2.2ms + + + + + + + ethtool [12830]2.1ms + + + + + + + + sh [12835]2.0ms + + + + + + + ethtool [12836]2.6ms + + + + + + + + sh [12844]2.1ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [12845]880.7ms + + + + + + + + sh [12850]2.1ms + + + + + + + ethtool [12851]6.4ms + + + + + + + + sh [12852]1.6ms + + + + + + + ethtool [12853]3.8ms + + + + + + + + sh [12858]2.5ms + + + + + + + ethtool [12859]2.6ms + + + + + + + + sh [12864]2.2ms + + + + + + + ethtool [12865]3.0ms + + + + + + + + sh [12870]3.0ms + + + + + + + ethtool [12871]2.4ms + + + + + + + + sh [12874]1.6ms + + + + + + + sh [12880]2.1ms + + + + + + + ethtool [12881]2.6ms + + + + + + + + sh [12886]2.1ms + + + + + + + ethtool [12887]2.0ms + + + + + + + + sh [12892]2.1ms + + + + + + + ethtool [12893]2.5ms + + + + + + + + sh [12898]1.6ms + + + + + + + ethtool [12899]2.8ms + + + + + + + + sh [12902]2.1ms + + + + + + + ethtool [12903]1.5ms + + + + + + + + + sh [12908]1.7ms + + + + + + + ethtool [12909]1.9ms + + + + + + + + sh [12914]2.2ms + + + + + + + ethtool [12915]2.5ms + + + + + + + + sh [12920]1.8ms + + + + + + + ethtool [12921]1.9ms + + + + + + + + sh [12926]1.7ms + + + + + + + ethtool [12927]2.5ms + + + + + + + + sh [12932]2.1ms + + + + + + + + + sh [12936]1.9ms + + + + + + + ethtool [12937]1.4ms + + + + + + + + sh [12942]2.2ms + + + + + + + ethtool [12943]1.8ms + + + + + + + + sh [12944]2.2ms + + + + + + + ethtool [12945]3.4ms + + + + + + + + sh [12948]2.1ms + + + + + + + ethtool [12949]1.9ms + + + + + + + + sh [12954]2.1ms + + + + + + + ethtool [12955]2.1ms + + + + + + + + sh [12960]1.8ms + + + + + + + ethtool [12961]2.4ms + + + + + + + + sh [12966]1.9ms + + + + + + + ethtool [12967]2.9ms + + + + + + + + sh [12970]2.2ms + + + + + + + sh [12972]2.3ms + + + + + + + ethtool [12973]3.2ms + + + + + + + + sh [12976]2.3ms + + + + + + + sh [12978]2.3ms + + + + + + + ethtool [12979]3.7ms + + + + + + + + sh [12982]2.3ms + + + + + + + sh [12984]2.3ms + + + + + + + ethtool [12985]3.2ms + + + + + + + + sh [12988]2.3ms + + + + + + + ethtool [12989]2.2ms + + + + + + + + sh [12990]2.3ms + + + + + + + ethtool [12991]3.6ms + + + + + + + + sh [12994]2.3ms + + + + + + + sh [12996]2.3ms + + + + + + + ethtool [12997]3.3ms + + + + + + + + sh [13000]2.3ms + + + + + + + ethtool [13001]2.0ms + + + + + + + + sh [13005]2.3ms + + + + + + + ethtool [13006]2.5ms + + + + + + + + sh [13009]2.4ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [13010]911.7ms + + + + + + + + sh [13017]2.1ms + + + + + + + + + ethtool [13018]6.7ms + + + + + + + + sh [13019]1.8ms + + + + + + + ethtool [13020]2.9ms + + + + + + + + sh [13025]2.4ms + + + + + + + ethtool [13026]2.6ms + + + + + + + + sh [13029]2.1ms + + + + + + + sh [13037]2.2ms + + + + + + + + + sh [13043]2.1ms + + + + + + + ethtool [13044]3.0ms + + + + + + + + sh [13049]1.7ms + + + + + + + ethtool [13050]2.5ms + + + + + + + + sh [13055]1.6ms + + + + + + + sh [13057]2.1ms + + + + + + + ethtool [13058]3.8ms + + + + + + + + sh [13061]2.1ms + + + + + + + sh [13069]2.2ms + + + + + + + ethtool [13070]3.1ms + + + + + + + + sh [13075]2.4ms + + + + + + + ethtool [13076]2.4ms + + + + + + + + sh [13077]2.4ms + + + + + + + ethtool [13078]3.0ms + + + + + + + + sh [13083]2.3ms + + + + + + + sh [13091]2.0ms + + + + + + + ethtool [13092]2.8ms + + + + + + + + sh [13103]1.9ms + + + + + + + ethtool [13104]3.1ms + + + + + + + + sh [13107]2.1ms + + + + + + + ethtool [13108]1.7ms + + + + + + + + sh [13109]2.2ms + + + + + + + ethtool [13110]3.0ms + + + + + + + + sh [13113]2.0ms + + + + + + + ethtool [13114]1.8ms + + + + + + + + sh [13119]2.2ms + + + + + + + ethtool [13120]2.7ms + + + + + + + + sh [13125]2.3ms + + + + + + + ethtool [13126]2.8ms + + + + + + + + sh [13131]4.1ms + + + + + + + ethtool [13132]2.2ms + + + + + + + + sh [13137]2.2ms + + + + + + + ethtool [13138]2.1ms + + + + + + + + sh [13143]2.2ms + + + + + + + ethtool [13144]2.9ms + + + + + + + + + sh [13149]2.3ms + + + + + + + ethtool [13150]2.1ms + + + + + + + + sh [13155]2.2ms + + + + + + + ethtool [13156]2.2ms + + + + + + + + sh [13161]2.1ms + + + + + + + ethtool [13162]2.3ms + + + + + + + + sh [13167]2.8ms + + + + + + + ethtool [13168]2.9ms + + + + + + + + sh [13176]2.3ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [13177]883.8ms + + + + + + + + + sh [13182]2.2ms + + + + + + + ethtool [13183]5.2ms + + + + + + + + sh [13186]1.7ms + + + + + + + ethtool [13187]2.7ms + + + + + + + + sh [13188]2.8ms + + + + + + + ethtool [13189]3.0ms + + + + + + + + sh [13192]1.7ms + + + + + + + ethtool [13193]2.1ms + + + + + + + + sh [13206]2.5ms + + + + + + + ethtool [13207]3.1ms + + + + + + + + sh [13212]2.2ms + + + + + + + sh [13220]2.3ms + + + + + + + ethtool [13221]3.0ms + + + + + + + + + sh [13234]2.4ms + + + + + + + ethtool [13235]2.7ms + + + + + + + + sh [13250]2.5ms + + + + + + + ethtool [13251]3.7ms + + + + + + + + sh [13256]2.1ms + + + + + + + ethtool [13257]2.3ms + + + + + + + + sh [13264]2.1ms + + + + + + + ethtool [13265]3.1ms + + + + + + + + sh [13270]2.3ms + + + + + + + ethtool [13271]2.4ms + + + + + + + + sh [13278]2.2ms + + + + + + + ethtool [13279]3.0ms + + + + + + + + sh [13284]2.7ms + + + + + + + ethtool [13285]2.4ms + + + + + + + + sh [13294]2.2ms + + + + + + + ethtool [13295]2.8ms + + + + + + + + sh [13300]2.0ms + + + + + + + ethtool [13301]1.9ms + + + + + + + + sh [13306]2.0ms + + + + + + + ethtool [13307]2.2ms + + + + + + + + sh [13312]2.1ms + + + + + + + ethtool [13313]3.1ms + + + + + + + + sh [13318]2.7ms + + + + + + + ethtool [13319]2.8ms + + + + + + + + sh [13324]2.1ms + + + + + + + ethtool [13325]3.0ms + + + + + + + + sh [13328]2.0ms + + + + + + + sh [13330]2.0ms + + + + + + + ethtool [13331]3.1ms + + + + + + + + sh [13339]2.3ms + + + + + + + + + sh [13341]2.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [13342]898.4ms + + + + + + + + sh [13349]1.6ms + + + + + + + ethtool [13350]6.6ms + + + + + + + + sh [13357]4.3ms + + + + + + + ethtool [13358]1.7ms + + + + + + + + sh [13359]2.3ms + + + + + + + sh [13363]2.2ms + + + + + + + ethtool [13364]1.7ms + + + + + + + + sh [13371]2.1ms + + + + + + + ethtool [13372]2.6ms + + + + + + + + sh [13377]2.3ms + + + + + + + ethtool [13378]1.9ms + + + + + + + + sh [13379]2.4ms + + + + + + + sh [13383]2.2ms + + + + + + + ethtool [13384]1.5ms + + + + + + + + sh [13385]2.2ms + + + + + + + ethtool [13386]2.6ms + + + + + + + + sh [13391]2.1ms + + + + + + + ethtool [13392]1.7ms + + + + + + + + sh [13393]2.2ms + + + + + + + ethtool [13394]3.0ms + + + + + + + + sh [13397]2.1ms + + + + + + + sh [13399]1.8ms + + + + + + + ethtool [13400]2.7ms + + + + + + + + sh [13405]2.1ms + + + + + + + ethtool [13406]2.8ms + + + + + + + + sh [13411]2.0ms + + + + + + + ethtool [13412]2.8ms + + + + + + + + + sh [13425]2.3ms + + + + + + + ethtool [13426]2.9ms + + + + + + + + sh [13431]3.6ms + + + + + + + ethtool [13432]1.9ms + + + + + + + + sh [13437]2.2ms + + + + + + + ethtool [13438]2.8ms + + + + + + + + sh [13443]2.0ms + + + + + + + ethtool [13444]2.6ms + + + + + + + + sh [13449]3.5ms + + + + + + + ethtool [13450]2.7ms + + + + + + + + + sh [13461]2.0ms + + + + + + + ethtool [13462]3.1ms + + + + + + + + sh [13465]2.2ms + + + + + + + sh [13467]2.3ms + + + + + + + ethtool [13468]3.4ms + + + + + + + + sh [13471]2.0ms + + + + + + + ethtool [13472]1.7ms + + + + + + + + sh [13479]2.4ms + + + + + + + ethtool [13480]2.9ms + + + + + + + + sh [13491]2.1ms + + + + + + + ethtool [13492]3.2ms + + + + + + + + sh [13497]2.0ms + + + + + + + ethtool [13498]2.8ms + + + + + + + + sh [13503]2.6ms + + + + + + + + + ethtool [13504]7.1ms + + + + + + + + + sh [13517]2.8ms + + + + + + + ethtool [13518]2.1ms + + + + + + + + sh [13523]3.4ms + + + + + + + sh [13525]2.4ms + + + + + + + ethtool [13526]2.7ms + + + + + + + + sh [13531]2.0ms + + + + + + + ethtool [13532]2.5ms + + + + + + + + sh [13537]2.0ms + + + + + + + ethtool [13538]2.5ms + + + + + + + + + sh [13549]2.3ms + + + + + + + ethtool [13550]3.3ms + + + + + + + + sh [13555]2.8ms + + + + + + + ethtool [13556]2.9ms + + + + + + + + sh [13561]2.1ms + + + + + + + ethtool [13562]3.5ms + + + + + + + + sh [13567]2.0ms + + + + + + + ethtool [13568]2.9ms + + + + + + + + sh [13573]1.8ms + + + + + + + ethtool [13574]2.9ms + + + + + + + + sh [13577]1.8ms + + + + + + + ethtool [13578]2.1ms + + + + + + + + sh [13583]1.9ms + + + + + + + ethtool [13584]2.6ms + + + + + + + + sh [13589]1.7ms + + + + + + + ethtool [13590]2.9ms + + + + + + + + sh [13595]3.3ms + + + + + + + ethtool [13596]2.8ms + + + + + + + + sh [13601]2.0ms + + + + + + + ethtool [13602]2.3ms + + + + + + + + + sh [13607]2.1ms + + + + + + + ethtool [13608]2.1ms + + + + + + + + sh [13613]2.1ms + + + + + + + ethtool [13614]3.2ms + + + + + + + + sh [13619]2.2ms + + + + + + + ethtool [13620]3.2ms + + + + + + + + sh [13625]3.4ms + + + + + + + ethtool [13626]2.2ms + + + + + + + + sh [13631]2.3ms + + + + + + + ethtool [13632]2.7ms + + + + + + + + sh [13637]2.0ms + + + + + + + ethtool [13638]2.3ms + + + + + + + + sh [13643]2.3ms + + + + + + + ethtool [13644]3.1ms + + + + + + + + sh [13662]2.4ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [13663]882.8ms + + + + + + + + + sh [13668]2.1ms + + + + + + + ethtool [13669]4.5ms + + + + + + + + sh [13672]2.9ms + + + + + + + sh [13674]1.6ms + + + + + + + ethtool [13675]3.4ms + + + + + + + + sh [13680]2.1ms + + + + + + + ethtool [13681]2.0ms + + + + + + + + sh [13686]2.1ms + + + + + + + ethtool [13687]2.9ms + + + + + + + + sh [13692]1.6ms + + + + + + + ethtool [13693]2.5ms + + + + + + + + sh [13702]1.6ms + + + + + + + ethtool [13703]1.6ms + + + + + + + + sh [13708]2.1ms + + + + + + + ethtool [13709]1.8ms + + + + + + + + sh [13714]2.1ms + + + + + + + ethtool [13715]2.1ms + + + + + + + + sh [13720]2.8ms + + + + + + + ethtool [13721]3.1ms + + + + + + + + sh [13726]1.8ms + + + + + + + ethtool [13727]2.5ms + + + + + + + + sh [13730]2.3ms + + + + + + + sh [13732]2.1ms + + + + + + + ethtool [13733]3.0ms + + + + + + + + sh [13736]1.8ms + + + + + + + ethtool [13737]1.6ms + + + + + + + + sh [13738]2.2ms + + + + + + + sh [13742]1.8ms + + + + + + + ethtool [13743]2.5ms + + + + + + + + sh [13748]2.1ms + + + + + + + ethtool [13749]2.6ms + + + + + + + + sh [13754]2.1ms + + + + + + + ethtool [13755]2.6ms + + + + + + + + sh [13760]1.8ms + + + + + + + ethtool [13761]2.4ms + + + + + + + + sh [13766]2.1ms + + + + + + + ethtool [13767]2.4ms + + + + + + + + sh [13768]2.9ms + + + + + + + ethtool [13769]3.3ms + + + + + + + + sh [13772]1.9ms + + + + + + + ethtool [13773]1.7ms + + + + + + + + + sh [13778]2.4ms + + + + + + + ethtool [13779]2.6ms + + + + + + + + sh [13784]2.3ms + + + + + + + ethtool [13785]2.3ms + + + + + + + + sh [13790]2.3ms + + + + + + + ethtool [13791]2.5ms + + + + + + + + sh [13792]2.4ms + + + + + + + ethtool [13793]3.2ms + + + + + + + + sh [13802]2.1ms + + + + + + + sh [13804]2.1ms + + + + + + + ethtool [13805]3.1ms + + + + + + + + sh [13808]2.1ms + + + + + + + sh [13816]2.7ms + + + + + + + ethtool [13817]3.0ms + + + + + + + + sh [13825]2.1ms + + + + + + + ethtool [13826]3.1ms + + + + + + + + sh [13827]2.3ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [13828]908.1ms + + + + + + + + sh [13829]4.2ms + + + + + + + sh [13831]2.5ms + + + + + + + ethtool [13832]3.1ms + + + + + + + + sh [13835]1.8ms + + + + + + + ethtool [13836]3.9ms + + + + + + + + sh [13839]1.6ms + + + + + + + ethtool [13840]2.2ms + + + + + + + + sh [13845]1.8ms + + + + + + + ethtool [13846]2.5ms + + + + + + + + sh [13849]1.7ms + + + + + + + ethtool [13850]1.3ms + + + + + + + + sh [13851]2.0ms + + + + + + + ethtool [13852]2.9ms + + + + + + + + sh [13855]1.6ms + + + + + + + ethtool [13856]2.1ms + + + + + + + + sh [13857]3.5ms + + + + + + + sh [13861]1.8ms + + + + + + + ethtool [13862]1.7ms + + + + + + + + sh [13867]2.1ms + + + + + + + ethtool [13868]2.3ms + + + + + + + + sh [13873]2.2ms + + + + + + + sh [13877]1.8ms + + + + + + + sh [13883]2.1ms + + + + + + + ethtool [13884]2.6ms + + + + + + + + sh [13885]2.6ms + + + + + + + ethtool [13886]3.2ms + + + + + + + + sh [13889]1.8ms + + + + + + + ethtool [13890]1.8ms + + + + + + + + sh [13895]2.1ms + + + + + + + ethtool [13896]2.8ms + + + + + + + + sh [13903]2.2ms + + + + + + + ethtool [13904]2.4ms + + + + + + + + sh [13909]1.8ms + + + + + + + ethtool [13910]2.2ms + + + + + + + + sh [13915]1.8ms + + + + + + + ethtool [13916]2.8ms + + + + + + + + sh [13919]1.8ms + + + + + + + ethtool [13920]1.4ms + + + + + + + + sh [13921]2.1ms + + + + + + + ethtool [13922]3.0ms + + + + + + + + sh [13925]1.9ms + + + + + + + ethtool [13926]1.4ms + + + + + + + + sh [13927]2.1ms + + + + + + + ethtool [13928]3.1ms + + + + + + + + sh [13931]2.1ms + + + + + + + ethtool [13932]2.3ms + + + + + + + + sh [13937]2.2ms + + + + + + + ethtool [13938]2.3ms + + + + + + + + sh [13943]1.8ms + + + + + + + ethtool [13944]2.4ms + + + + + + + + sh [13953]4.8ms + + + + + + + sh [13955]1.9ms + + + + + + + ethtool [13956]2.9ms + + + + + + + + sh [13961]3.2ms + + + + + + + ethtool [13962]2.9ms + + + + + + + + sh [13973]3.2ms + + + + + + + ethtool [13974]2.8ms + + + + + + + + sh [13979]2.1ms + + + + + + + ethtool [13980]2.9ms + + + + + + + + sh [13985]2.4ms + + + + + + + + + sh [13991]2.3ms + + + + + + + + + ethtool [13992]7.4ms + + + + + + + + sh [13997]2.3ms + + + + + + + ethtool [13998]2.7ms + + + + + + + + sh [14003]2.8ms + + + + + + + ethtool [14004]1.9ms + + + + + + + + sh [14009]2.4ms + + + + + + + sh [14015]4.2ms + + + + + + + sh [14017]2.2ms + + + + + + + + + + sh [14029]2.6ms + + + + + + + ethtool [14030]2.8ms + + + + + + + + sh [14035]2.2ms + + + + + + + + sh [14051]2.2ms + + + + + + + sh [14059]2.1ms + + + + + + + ethtool [14060]3.0ms + + + + + + + + sh [14063]3.5ms + + + + + + + sh [14071]3.4ms + + + + + + + ethtool [14072]3.1ms + + + + + + + + sh [14077]2.4ms + + + + + + + ethtool [14078]2.7ms + + + + + + + + sh [14083]2.3ms + + + + + + + ethtool [14084]2.9ms + + + + + + + + sh [14089]2.1ms + + + + + + + ethtool [14090]3.1ms + + + + + + + + sh [14095]2.4ms + + + + + + + + + sh [14101]2.4ms + + + + + + + ethtool [14102]3.4ms + + + + + + + + sh [14115]2.4ms + + + + + + + + + sh [14121]2.3ms + + + + + + + + + sh [14127]2.2ms + + + + + + + + + sh [14133]2.0ms + + + + + + + ethtool [14134]3.0ms + + + + + + + + sh [14139]2.3ms + + + + + + + ethtool [14140]2.8ms + + + + + + + + sh [14150]2.3ms + + + + + + + ethtool [14151]2.7ms + + + + + + + + sh [14152]2.4ms + + + + + + + ethtool [14153]2.3ms + + + + + + + + sh [14166]2.2ms + + + + + + + ethtool [14167]2.6ms + + + + + + + + sh [14174]2.3ms + + + + + + + ethtool [14175]2.9ms + + + + + + + + sh [14180]2.3ms + + + + + + + ethtool [14181]3.0ms + + + + + + + + sh [14185]2.3ms + + + + + + + ethtool [14186]3.0ms + + + + + + + + sh [14189]2.5ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [14190]875.6ms + + + + + + + + sh [14191]3.6ms + + + + + + + ethtool [14192]2.7ms + + + + + + + + sh [14195]1.6ms + + + + + + + ethtool [14196]6.6ms + + + + + + + + sh [14197]2.2ms + + + + + + + ethtool [14198]2.6ms + + + + + + + + sh [14199]2.4ms + + + + + + + ethtool [14200]4.2ms + + + + + + + + sh [14205]2.1ms + + + + + + + ethtool [14206]2.2ms + + + + + + + + sh [14211]1.8ms + + + + + + + ethtool [14212]2.4ms + + + + + + + + sh [14223]2.7ms + + + + + + + ethtool [14224]2.7ms + + + + + + + + sh [14229]2.0ms + + + + + + + ethtool [14230]2.6ms + + + + + + + + sh [14239]3.2ms + + + + + + + sh [14245]2.8ms + + + + + + + sh [14247]2.0ms + + + + + + + ethtool [14248]2.9ms + + + + + + + + sh [14251]2.1ms + + + + + + + ethtool [14252]2.3ms + + + + + + + + sh [14257]1.8ms + + + + + + + ethtool [14258]1.8ms + + + + + + + + sh [14263]2.1ms + + + + + + + ethtool [14264]2.0ms + + + + + + + + sh [14269]1.9ms + + + + + + + ethtool [14270]2.7ms + + + + + + + + sh [14275]2.2ms + + + + + + + ethtool [14276]3.0ms + + + + + + + + sh [14279]2.0ms + + + + + + + sh [14281]2.0ms + + + + + + + ethtool [14282]3.1ms + + + + + + + + sh [14285]2.3ms + + + + + + + sh [14287]2.0ms + + + + + + + ethtool [14288]3.2ms + + + + + + + + sh [14291]2.0ms + + + + + + + ethtool [14292]2.5ms + + + + + + + + sh [14293]2.4ms + + + + + + + + + sh [14297]2.2ms + + + + + + + ethtool [14298]1.8ms + + + + + + + + sh [14305]4.0ms + + + + + + + ethtool [14306]2.9ms + + + + + + + + sh [14311]2.1ms + + + + + + + ethtool [14312]3.0ms + + + + + + + + sh [14317]2.1ms + + + + + + + ethtool [14318]2.8ms + + + + + + + + sh [14321]2.0ms + + + + + + + sh [14323]2.3ms + + + + + + + ethtool [14324]3.2ms + + + + + + + + sh [14327]2.3ms + + + + + + + ethtool [14328]2.2ms + + + + + + + + sh [14333]1.9ms + + + + + + + ethtool [14334]2.5ms + + + + + + + + sh [14339]2.2ms + + + + + + + ethtool [14340]2.7ms + + + + + + + + sh [14345]2.1ms + + + + + + + ethtool [14346]2.9ms + + + + + + + + sh [14354]1.7ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [14355]855.1ms + + + + + + + + sh [14360]1.6ms + + + + + + + + + ethtool [14361]6.8ms + + + + + + + + + sh [14370]2.4ms + + + + + + + ethtool [14371]3.8ms + + + + + + + + sh [14376]2.4ms + + + + + + + + + sh [14382]2.4ms + + + + + + + sh [14390]2.4ms + + + + + + + ethtool [14391]2.7ms + + + + + + + + sh [14398]2.4ms + + + + + + + + + sh [14404]2.3ms + + + + + + + ethtool [14405]2.7ms + + + + + + + + sh [14412]2.4ms + + + + + + + ethtool [14413]3.3ms + + + + + + + + sh [14418]2.3ms + + + + + + + ethtool [14419]2.6ms + + + + + + + + sh [14424]2.3ms + + + + + + + ethtool [14425]2.0ms + + + + + + + + sh [14426]2.3ms + + + + + + + sh [14430]2.2ms + + + + + + + ethtool [14431]2.0ms + + + + + + + + sh [14436]2.1ms + + + + + + + ethtool [14437]2.6ms + + + + + + + + sh [14442]1.7ms + + + + + + + ethtool [14443]2.5ms + + + + + + + + sh [14448]1.8ms + + + + + + + ethtool [14449]3.1ms + + + + + + + + sh [14452]1.8ms + + + + + + + ethtool [14453]1.5ms + + + + + + + + sh [14458]1.8ms + + + + + + + ethtool [14459]1.5ms + + + + + + + + sh [14460]1.8ms + + + + + + + ethtool [14461]3.1ms + + + + + + + + sh [14464]2.1ms + + + + + + + ethtool [14465]2.2ms + + + + + + + + sh [14470]2.1ms + + + + + + + sh [14476]2.3ms + + + + + + + ethtool [14477]2.3ms + + + + + + + + sh [14482]2.0ms + + + + + + + ethtool [14483]2.6ms + + + + + + + + sh [14488]2.1ms + + + + + + + ethtool [14489]2.8ms + + + + + + + + sh [14494]2.1ms + + + + + + + ethtool [14495]3.0ms + + + + + + + + sh [14498]2.3ms + + + + + + + sh [14500]2.1ms + + + + + + + ethtool [14501]3.2ms + + + + + + + + sh [14504]2.3ms + + + + + + + sh [14506]2.4ms + + + + + + + ethtool [14507]3.2ms + + + + + + + + sh [14510]2.3ms + + + + + + + sh [14515]2.3ms + + + + + + + ethtool [14516]2.4ms + + + + + + + + sh [14521]2.0ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ethtool [14522]882.1ms + + + + + + + + sh [14527]2.1ms + + + + + + + + + ethtool [14528]8.1ms + + + + + + + + sh [14539]3.5ms + + + + + + + ethtool [14540]2.0ms + + + + + + + + sh [14545]2.4ms + + + + + + + ethtool [14546]2.2ms + + + + + + + + sh [14551]2.4ms + + + + + + + ethtool [14552]2.6ms + + + + + + + + sh [14557]2.0ms + + + + + + + ethtool [14558]2.2ms + + + + + + + + sh [14563]2.3ms + + + + + + + ethtool [14564]2.9ms + + + + + + + + sh [14569]2.4ms + + + + + + + ethtool [14570]2.7ms + + + + + + + + sh [14575]3.2ms + + + + + + + ethtool [14576]2.2ms + + + + + + + + sh [14581]2.4ms + + + + + + + ethtool [14582]2.3ms + + + + + + + + sh [14587]2.0ms + + + + + + + ethtool [14588]2.8ms + + + + + + + + sh [14593]4.0ms + + + + + + + ethtool [14594]2.2ms + + + + + + + + sh [14599]2.3ms + + + + + + + ethtool [14600]2.6ms + + + + + + + + sh [14605]1.9ms + + + + + + + ethtool [14606]3.1ms + + + + + + + + sh [14611]2.2ms + + + + + + + sh [14615]2.3ms + + + + + + + sh [14617]2.3ms + + + + + + + ethtool [14618]3.1ms + + + + + + + + sh [14623]2.6ms + + + + + + + ethtool [14624]2.7ms + + + + + + + + sh [14629]2.3ms + + + + + + + ethtool [14630]2.3ms + + + + + + + + sh [14635]2.0ms + + + + + + + ethtool [14636]2.3ms + + + + + + + + sh [14647]2.3ms + + + + + + + + + sh [14653]2.0ms + + + + + + + ethtool [14654]2.6ms + + + + + + + + sh [14659]2.4ms + + + + + + + ethtool [14660]2.9ms + + + + + + + + sh [14665]2.1ms + + + + + + + ethtool [14666]2.6ms + + + + + + + + sh [14671]3.2ms + + + + + + + ethtool [14672]1.8ms + + + + + + + + sh [14673]2.4ms + + + + + + + sh [14677]2.3ms + + + + + + + ethtool [14678]2.1ms + + + + + + + + sh [14679]2.3ms + + + + + + + ethtool [14680]3.2ms + + + + + + + + sh [14681]2.4ms + + + + + + + ethtool [14682]4.8ms + + + + + + + + sh [14685]2.3ms + + + + + + + + ethtool [14686]3.3ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [8317]685.6ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [8319]576.0ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [8321]620.6ms + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [8323]185.5ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pcied [8322]656.0ms + + + + + + + + + + + + + + + + + sensord [8339]47.8ms + + + + + + + + runc [8826]14.3ms + + + + + + + + + + + + + + + + + supervisorctl [8846]168.5ms + + + + + + + + + + + + + + + + supervisorctl [11928]164.5ms + + + + + + + + pmon.sh [7355]6.8ms + + + + + + + + + + + + + + + + + + + + + python3 [7366]256.5ms + + + + + + + + lldp.sh [7372]10.5ms + + + + + + + lldp.sh [7376]8.5ms + + + + + + + + + + + docker [7384]39.2ms + + + + + + + + lldp.sh [7408]1.1ms + + + + + + + python [7410]33.5ms + + + + + + + + + + + + + + + + + + + + + + python3 [7417]279.9ms + + + + + + + + + + + + containerd-shim [7437]44.1ms + + + + + + + runc [7447]19.4ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + supervisord [7458]434.8ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [7484]439.5ms + + + + + + + + + + + + + + + + + + + + + + + python3 [8220]247.3ms + + + + + + + + + + + python3 [8221]110.5ms + + + + + + + rsyslogd [8233]13.2ms + + + + + + + + runc [8782]14.5ms + + + + + + + + + + + + + + + + + supervisorctl [8791]217.6ms + + + + + + + runc [11886]15.3ms + + + + + + + + + + + + + + + + + + supervisorctl [11895]204.5ms + + + + + + + + radv.sh [7496]5.6ms + + + + + + + radv.sh [7504]4.2ms + + + + + + + + + + + + + + + + + + + + + + + + python3 [7506]282.8ms + + + + + + + + + + + + containerd-shim [7520]46.2ms + + + + + + + + + runc [7531]18.2ms + + + + + + + 7 [7542]6.4ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + supervisord [7557]464.0ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [7603]457.6ms + + + + + + + + + + + + + + + + + + + + + + + python3 [8225]258.9ms + + + + + + + + + + + + + + + python3 [8226]172.4ms + + + + + + + rsyslogd [8241]11.8ms + + + + + + + bash [8302]8.9ms + + + + + + + + bash [8303]1.4ms + + + + + + + + + + + + + + + + + + supervisorctl [8304]204.9ms + + + + + + + grep [8305]2.2ms + + + + + + + + runc [8708]15.3ms + + + + + + + + + + + + + + + supervisorctl [8717]181.1ms + + + + + + + runc [11827]13.5ms + + + + + + + + + + + + + + + + + supervisorctl [11836]222.8ms + + + + + + + + + + + + containerd-shim [7570]52.5ms + + + + + + + runc [7582]17.5ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + supervisord [7607]718.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [7629]432.0ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [8223]486.6ms + + + + + + + + + + + + + python3 [8224]168.0ms + + + + + + + rsyslogd [8237]32.3ms + + + + + + + bash [8306]7.5ms + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [8307]281.0ms + + + + + + + + + + lldpd [8310]45.2ms + + + + + + + lldpcli [8311]8.1ms + + + + + + + + + + + + + + + + + + + + + lldpd [8312]106.6ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [8330]402.2ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + python3 [8342]226.7ms + + + + + + + + runc [7616]11.2ms + + + + + + + runc [8748]12.5ms + + + + + + + + + + + + + + + supervisorctl [8757]171.1ms + + + + + + + runc [11856]15.6ms + + + + + + + + + + + + + + + + + + supervisorctl [11865]200.6ms + + + + + + + + dhcp_relay.sh [7628]9.2ms + + + + + + + + + + + + + sonic-db-cli [7631]119.9ms + + + + + + + + + + + + + + + sonic-db-cli [7698]130.5ms + + + + + + + + + + + + + sonic-db-cli [7712]126.3ms + + + + + + + dhcp_relay.sh [7771]5.8ms + + + + + + + + + + + + + + + + + + + + + + python3 [7777]314.2ms + + + + + + + + lldp.sh [7649]6.5ms + + + + + + + lldp.sh [7653]6.1ms + + + + + + + + + + + + + + + + + + + + + + + + python3 [7656]334.5ms + + + + + + + + ntp-config.sh [7651]7.8ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [7657]456.9ms + + + + + + + + + + + sonic-db-cli [7804]101.1ms + + + + + + + + + + + sonic-db-cli [7913]119.1ms + + + + + + + + ntp-systemd-wra [8064]7.2ms + + + + + + + + + + + + + + + + + + + sonic-cfggen [8083]241.6ms + + + + + + + + + + + + + + + + + + + sonic-cfggen [8196]248.1ms + + + + + + + + ntpd [8206]22.5ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hostcfgd [10501]288.9ms + + + + + + + + sudo [10534]1.7ms + + + + + + + + sh [10548]1.0ms + + + + + + + sudo [10549]7.0ms + + + + + + + + systemctl [10552]8.5ms + + + + + + + + sh [10590]1.1ms + + + + + + + + + sudo [10591]6.3ms + + + + + + + + systemctl [10592]9.6ms + + + + + + + + sh [10627]1.3ms + + + + + + + sudo [10628]10.1ms + + + + + + + + systemctl [10629]7.0ms + + + + + + + + sh [10644]1.3ms + + + + + + + sudo [10645]6.4ms + + + + + + + + + + systemctl [10646]12.2ms + + + + + + + + + sudo [10673]1.5ms + + + + + + + + + sudo [10678]5.7ms + + + + + + + + + sudo [10693]5.9ms + + + + + + + + + sudo [10703]1.4ms + + + + + + + + + sudo [10713]5.7ms + + + + + + + + systemctl [10716]8.6ms + + + + + + + + + sudo [10750]5.6ms + + + + + + + + systemctl [10753]6.3ms + + + + + + + + sh [10813]1.1ms + + + + + + + service [10814]3.3ms + + + + + + + + + + systemctl [10818]1.5ms + + + + + + + + + sh [10880]1.1ms + + + + + + + + systemctl [10881]1.9ms + + + + + + + + + + + + aaastatsd [10502]86.6ms + + + + + + + process-reboot- [10503]34.3ms + + + + + + + (sd-executor) [10756]5.0ms + + + + + + + systemd-cryptse [10758]6.7ms + + + + + + + systemd-debug-g [10759]6.5ms + + + + + + + systemd-getty-g [10761]6.6ms + + + + + + + systemd-rc-loca [10764]6.3ms + + + + + + + systemd-sonic-g [10766]2.3ms + + + + + + + systemd-system- [10767]5.1ms + + + + + + + systemd-sysv-ge [10768]6.1ms + + + + + + + systemd-veritys [10769]7.0ms + + + + + + + + ntp-config.sh [10882]4.5ms + + + + + + + + + + + + + + + + + sonic-cfggen [10883]205.0ms + + + + + + + + + sonic-db-cli [10904]80.3ms + + + + + + + + + sonic-db-cli [10911]76.9ms + + + + + + + + ntp-systemd-wra [10926]5.5ms + + + + + + + + + + + + + + + + + + + + + + + sonic-cfggen [10933]301.4ms + + + + + + + + + + + + + + + + + + + sonic-cfggen [10934]277.1ms + + + + + + + + ntpd [10936]8.8ms + + + + + + +16.1s + + + +Bootchart for r-ocelot-02 - Wed, 04 May 2022 13:25:47 +0000 +System: Linux 5.10.0-8-2-amd64 #1 SMP Debian 5.10.46-4 (2021-08-03) x86_64 +CPU: Intel(R) Xeon(R) CPU D-1527 @ 2.20GHz +Boot options: BOOT_IMAGE=/image-systemd-bootchart.0-dirty-20220504.143906/boot/vmlinuz-5.10.0-8-2-amd64 root=UUID=0eafb6b8-ebdd-4f07-bb18-e880e504bae7 rw console=tty0 console=ttyS0,9600n8 quiet intel_idle.max_cstate=0 net.ifnames=0 biosdevname=0 loop=image-systemd-bootchart.0-dirty-20220504.143906/fs.squashfs loopfstype=squashfs systemd.unified_cgroup_hierarchy=0 apparmor=1 security=apparmor varlog_size=4096 usbcore.autosuspend=-1 +Build: Debian GNU/Linux 11 (bullseye) +Log start time: 3.189s +Idle time: 16.082s +Graph data: 25.000 samples/sec, recorded 4500 total, dropped 1 samples, 12511 processes, 399 filtered + + + +Top CPU consumers: +48965.5ms - systemd-bootcha [334] +6351.8ms - python3 [8315] +5081.6ms - redis-server [4689] +2555.9ms - rasdaemon [610] +2512.8ms - supervisord [5300] +2196.4ms - syncd [8249] +1952.4ms - python3 [6367] +1923.4ms - depmod [797] +1114.0ms - orchagent [6426] +1038.7ms - systemd-udevd [356] + + + + diff --git a/doc/profiling/sonic_bootchart.md b/doc/profiling/sonic_bootchart.md new file mode 100755 index 0000000000..aee21d21e0 --- /dev/null +++ b/doc/profiling/sonic_bootchart.md @@ -0,0 +1,231 @@ + +# SONiC Boot Chart # + + +## Table of Content + +- [Revision](#revision) +- [Scope](#scope) +- [Definitions/Abbreviations](#definitionsabbreviations) +- [Overview](#overview) +- [Requirements](#requirements) +- [Architecture Design](#architecture-design) +- [High-Level Design](#high-level-design) +- [SAI API](#sai-api) +- [Configuration and management](#configuration-and-management) + - [Manifest (if the feature is an Application Extension)](#manifest-if-the-feature-is-an-application-extension) + - [CLI/YANG model Enhancements](#cliyang-model-enhancements) + - [Config DB Enhancements](#config-db-enhancements) +- [Warmboot and Fastboot Design Impact](#warmboot-and-fastboot-design-impact) +- [Restrictions/Limitations](#restrictionslimitations) +- [Testing Requirements/Design](#testing-requirementsdesign) + - [Unit Test cases](#unit-test-cases) + - [System Test cases](#system-test-cases) +- [Open/Action items](#openaction-items) + +### Revision + +### Scope + +SONiC OS is highly modular and composible system, where every new feature is +often implemented as a new script, utility, daemon or docker container. A lot of +these components start at SONiC boot togather with respect to their dependencies +requirements. Majority of start scripts use short-living small utilities written +in python, bash or other scripting languages, invoke Jinja2 template generation. +This leads to potential boot time performance degradation that we need a tool to +detect and analyze. + +### Definitions/Abbreviations + +N/A + +### Overview + +This document describes an integration of one of systemd tools called +*systemd-bootchart*. This tool is a sampling based system profiler that is used +to analyze boot up performance but not limited to and can be used to collect +samples after the system is booted. The output produced by systemd-bootchart is +an SVG image that looks like this: + +

+Figure 1. Bootchart example +

+ +### Requirements + +- Integrate systemd-bootchart with SONiC OS +- systemd-bootchart is by default installed in the system +- systemd-bootchart is by default disabled and user need to enable it via CLI +- SONiC CLI tool to interact with systemd-bootchart +- Support commands to enable/disable systemd-bootchart +- Configure the amount of samples to collect and frequency +- Displaying systemd-bootchart configuration and generated SVG plots + +### Architecture Design + +N/A + +### High-Level Design + +SONiC build system includes a new build-time flag to INCLUDE_BOOTCHART (y/n). +When this flag is set a *systemd-bootchart* debian package is installed in SONiC +host from upstream debian repositories (Installed size 128 KB). + +Example INCLUDE_BOOTCHART flag usage: + +Include bootchart: +``` +make INCLUDE_BOOTCHART=y target/sonic-mellanox.bin +``` + +Do not include bootchart: +``` +make INCLUDE_BOOTCHART=n target/sonic-mellanox.bin +``` + +SONiC provides a default configuration for bootchart located at +/etc/systemd/bootchart.conf: + +```ini +[Bootchart] +Samples=4500 +Frequency=25 +``` + +This configuration means that samples are collected for 3 minutes of uptime with +a frequency of 25 samples per second. + +SONiC utilities is extendeded with a new script under *scripts/* to include a +new utility *sonic-bootchart*. + +Also a flag added to the build incdicating default status: + +``` +ENABLE_BOOTCHART=y +``` + +### SAI API + +N/A + +### Configuration and management + +*sonic-bootchart* is a standalone utility, like *sonic-kdump-config*, +**sonic-installer*, etc. + +Command line interface: + +``` +admin@sonic:~$ sudo sonic-bootchart +Usage: sonic-bootchart [OPTIONS] COMMAND [ARGS]... + + Main CLI group + +Options: + --help Show this message and exit. + +Commands: + config Configure bootchart NOTE: This command requires elevated (root)... + disable Disable bootchart NOTE: This command requires elevated (root)... + enable Enable bootchart NOTE: This command requires elevated (root)... + show Display bootchart configuration +``` + +Enable/Disable bootchart: + +``` +admin@sonic:~$ sudo sonic-bootchart enable +Running command: systemctl enable systemd-bootchart +admin@sonic:~$ sudo sonic-bootchart disable +Running command: systemctl disable systemd-bootchart +``` + +In case image is built without bootchart included (INCLUDE_BOOTCHART=n) +sonic-bootchart will print an error: + +``` +admin@sonic:~$ sudo sonic-bootchart enable +systemd-bootchart is not installed +``` + +Once bootchart is enabled a systemd-bootchart.service is enabled in systemd +which starts a daemon early at boot that collects samples. This setting is +permanent, meaning, after it is enabled, bootchart will always run at boot until +disabled, *config save*, *config reload* do not affect this setting. + + +Update configuration example: + +``` +admin@sonic:~$ sudo sonic-bootchart config --time-span 50 --frequency 10 +``` + +This command will update /etc/systemd/bootchart.conf. The next time bootchart +will run (at system start after reboot) it will take the new values. +*systemd-bootchart* saves the plots to a temporary directory /run/log that is +*flushed after reboot. + +Displaying configuration, operational status and output SVG plots: + +``` +admin@sonic:~$ sudo sonic-bootchart show +Status Operational Status Frequency Time Span (sec) Output +-------- -------------------- ----------- ---------------- ------------------------------------ +enabled in-active 10 50 /run/log/bootchart-20220504-1325.svg +``` + +Fields description: + +| Field | Comment | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | +| Status | Output of "systemctl is-enabled systemd-bootchart". Shows whether this service is configured to start at boot (enabled/disabled) | +| Operational Status | Output of "systemctl is-action systemd-bootchart". Shows whether this service is currently collecting samples (active/in-active) | +| Frequency | How frequent to collect samples per second | +| Time Span | The time how long after boot samples will be collected. Based on it the samples count is calculated as Frequency x Time Span | +| Output | If systemd-bootchart finished collecting samples (in-active) this column will display resulting plots, otherwise this column is empty | + + +Usage example: + +- First make sure you have SONiC image built with INCLUDE_BOOTCHART=y +- Enable bootchart: "sudo sonic-bootchart enable" +- Perform any kind of reboot: "sudo reboot" or "sudo warm-reboot" or "sudo +fast-reboot" + - Wait till system reboots and the plot is generated by quering +"sudo sonic-bootchart show" + +#### Manifest (if the feature is an Application Extension) + +N/A + +#### CLI/YANG model Enhancements + +N/A + +#### Config DB Enhancements + +N/A + +### Warmboot and Fastboot Design Impact +N/A + +### Restrictions/Limitations + +### Testing Requirements/Design +N/A + +#### Unit Test cases + +Cover CLI with UT for: + - enabling bootchart + - disabling bootchart + - config/show commands + +#### System Test cases + +N/A + +### Open/Action items + +- SONiC installer bootchart config migration. Being able to run this tool for reboot with SONiC-2-SONiC upgrade +- Requested a possibility to run the tool in runtime after boot From 01dafadc748f3e78d279b027b97c461d748ac5a8 Mon Sep 17 00:00:00 2001 From: kannankvs Date: Wed, 22 Jun 2022 10:09:29 +0530 Subject: [PATCH 39/60] Updated workgroups for PINS subgroup (#1019) Updated workgroups for PINS subgroup --- workgroups.html | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/workgroups.html b/workgroups.html index 267c5aeee2..97a7d82f9b 100644 --- a/workgroups.html +++ b/workgroups.html @@ -349,6 +349,18 @@

SONiC-Documentation-Workgroup Ch

+
+

SONiC-PINS Subgroup

+

Join the mailing list sonic-pins-subgroup@googlegroups.com

+

Workgroup SONiC-PINS Subgroup +

Current Status : Active

+

SONiC-PINS Subgroup Charter

+

+

    +
  1. This subgroup is for PINS which extends SONiC with an Software-Defined Networking (SDN) interface and P4 programmable pipeline.
  2. +
+

+
From d2c949ff2938a2a820b66212535a4db4526c4a38 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Fri, 24 Jun 2022 04:52:43 +0800 Subject: [PATCH 40/60] SONiC bulk counter support (#1009) PR https://github.com/opencomputeproject/SAI/pull/1352/files introduced new SAI APIs that supports bulk stats: sai_bulk_object_get_stats sai_bulk_object_clear_stats SONiC flex counter infrastructure shall utilize bulk stats API to gain better performance. This document discusses how to integrate these two new APIs to SONiC. --- doc/bulk_counter/bulk_counter.md | 152 ++++++++++++++++++ doc/bulk_counter/bulk_counter.svg | 1 + doc/bulk_counter/counter_collect.svg | 1 + .../object_join_counter_group.svg | 1 + 4 files changed, 155 insertions(+) create mode 100644 doc/bulk_counter/bulk_counter.md create mode 100644 doc/bulk_counter/bulk_counter.svg create mode 100644 doc/bulk_counter/counter_collect.svg create mode 100644 doc/bulk_counter/object_join_counter_group.svg diff --git a/doc/bulk_counter/bulk_counter.md b/doc/bulk_counter/bulk_counter.md new file mode 100644 index 0000000000..f4eb344a6d --- /dev/null +++ b/doc/bulk_counter/bulk_counter.md @@ -0,0 +1,152 @@ +# SONiC Bulk Counter Design # + +## Table of Content + +### Revision + + | Rev | Date | Author | Change Description | + |:---:|:-----------:|:------------------:|-----------------------------------| + | 0.1 | | Junchao Chen | Initial version | + +### Scope + +This document is the design document for bulk counter feature on SONiC. + +### Definitions/Abbreviations + +N/A + +### Overview + +PR https://github.com/opencomputeproject/SAI/pull/1352/files introduced new SAI APIs that supports bulk stats: + +- sai_bulk_object_get_stats +- sai_bulk_object_clear_stats + +SONiC flex counter infrastructure shall utilize bulk stats API to gain better performance. This document discusses how to integrate these two new APIs to SONiC. + +### Requirements + +- Syncd shall use bulk stats APIs based on object type. E.g. for a counter group that queries queue and pg stats, queue stats support bulk while pg stats does not, in that case queue stats shall use bulk API, pg stats shall use non bulk API +- For a certain object type in a counter group, it shall use bulk stats only if: + - The stats capability for each counter IDs shall match the stats mode of the counter group + - Each object queries exactly the same counter IDs. (Requirement from function signature of sai_bulk_object_get_stats and sai_bulk_object_clear_stats) +- Syncd shall automatically fall back to old way if bulk stats APIs are not supported +- Syncd shall utilize API sai_query_stats_capability to query bulk capability. Syncd shall treat counter as no bulk capability if API sai_query_stats_capability return error except SAI_STATUS_BUFFER_OVERFLOW (SAI_STATUS_BUFFER_OVERFLOW requires a retry with larger buffer) +- Syncd shall call bulk stats API in flex counter thread and avoid calling it in main thread to make sure main thread only handles short and high priority tasks. (This is the default behavior in flex counter infrastructure) +- In phase 1, the change is limited to syncd only, no CLI/swss change. Syncd shall deduce the bulk stats mode according to the stats mode defined in FLEX DB: + - SAI_STATS_MODE_READ -> SAI_STATS_MODE_BULK_READ + - SAI_STATS_MODE_READ_AND_CLEAR -> SAI_STATS_MODE_BULK_READ_AND_CLEAR + +### Architecture Design + +For each counter group, different statistic type is allowed to chooose bulk or non-bulk API based on SAI capability. + +![architecture](/doc/bulk_counter/bulk_counter.svg). + +> Note: In the picture, pg/queue watermark statistic use bulk API and buffer watermark statistic uses non-bulk API. This is just an example to show the design idea. + +### High-Level Design + +Changes shall be made to sonic-sairedis to support this feature. No CLI change. No DB schema change. + +> Note: Code present in this design document is only for demonstrating the design idea, it is not production code. + +#### sonic-sairedis + +##### Bulk Statistic Context + +A new structure shall be added to FlexCounter class. + +This structure is created because: + +- Meet the signature of sai_bulk_object_get_stats and sai_bulk_object_clear_stats +- Avoid constructing these information each time collecting statistic. The bulk context shall only be updated under below cases: + - New object join counter group. E.g. adding a new port object. + - Existing object leave counter group. E.g removing an existing port object. + - Other case such as counter IDs is updated by user. + +```cpp +struct BulkStatsContext +{ + sai_object_type_t object_type; + std::vector object_vids; + std::vector object_keys; + std::vector counter_ids; + std::vector statuses; + std::vector counters; + std::shared_ptr stats_capas; +}; +``` +- object_type: object type. +- object_keys: objects that participate the bulk call. E.g. for port, SAI object id value shall be put into sai_object_key_t structure. +- counter_ids: SAI statistic IDs that will be queried/cleared by the bulk call. +- statuses: SAI bulk API return value for each object. +- counters: counter values that will be fill by vendor SAI. +- stats_capas: stats capability for each statitstic IDs for current object type. + +The flow of how to updating bulk context will be discussed in following section. + +For a given object type, diffrent object instance may support different stats capability, so, a list of BulkStatsContext shall be added to FlexCounter class for each object type. + +```cpp + +std::vector m_portBulkContexts; +std::vector m_priorityGroupBulkContexts; +... + +``` + +##### Update Bulk Context + +1. New object join counter group. + +![Add Object Flow](/doc/bulk_counter/object_join_counter_group.svg). + +2. Existing object leave counter group, related data shall be removed from bulk context. + +##### Statistic Collect + +![Collect Counter Flow](/doc/bulk_counter/counter_collect.svg). + +### SAI API + +SAI APIs shall be used in this feature: + +- sai_bulk_object_get_stats +- sai_bulk_object_clear_stats + +### Configuration and management + +N/A + +### Warmboot and Fastboot Design Impact + +No extra logic on SONiC side is needed to handle warmboot/fastboot. + +- As fastboot dealys all counters querying, this feature does not affect fastboot. +- For warmboot, it is vendor SAI implementation's responsible to make sure that there must be no error if warmboot starts while bulk API is called. + +### Restrictions/Limitations + +- Bulk collect attribute value is not supported +- Buffer pool stats is not support for bulk because different buffer pool may have different stats mode. E.g. pool1 has mode SAI_STATS_MODE_READ, pool2 has mode SAI_STATS_MODE_READ_AND_CLEAR. The new SAI bulk API only allows specify one stats mode. +- Maximum object number at one bulk call is a limitation based on vendor implementation. + +### Performance Improvement + +A rough test has been done on Nvidia platform for queue. + +- Non bulk API: get stats for one queue takes X seconds; get stats for 32 port * 8 queue is 256X seconds; +- Bulk API: get stats for one queue takes Y seconds; get stats for 32 port * 8 queue is almost Y seconds; + +X is almost euqal to Y. So, more object instances, more performance improvement. + +### Testing Requirements/Design + +As this feature does not introduce any new function, unit test shall be good enough to cover the code changes and new sonic-mgmt/VS test cases will be added. + +#### Unit Test cases + +- test_update_bulk_context +- test_bulk_collect_stats diff --git a/doc/bulk_counter/bulk_counter.svg b/doc/bulk_counter/bulk_counter.svg new file mode 100644 index 0000000000..26023979c9 --- /dev/null +++ b/doc/bulk_counter/bulk_counter.svg @@ -0,0 +1 @@ +
Syncd
Syncd
Counter Thread 1
Counter Thread 1
pg watermark
pg watermark
queue watermark
queue watermark
buffer watermark
buffer watermark
Vendor SAI
Vendor SAI
Counter Thread 2
Counter Thread 2
...
...
Counter Thread n
Counter Thread n
...
...
...
...
bulk api
bulk api
bulk api
bulk api
non bulk api
non bulk api
...
...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/doc/bulk_counter/counter_collect.svg b/doc/bulk_counter/counter_collect.svg new file mode 100644 index 0000000000..f8d4364f46 --- /dev/null +++ b/doc/bulk_counter/counter_collect.svg @@ -0,0 +1 @@ +
Collect stats start
Collect stats start
Old way
Old way
Support bulk?
Support bulk?
Call sai_object_bulk_get_stats
Call sai_object_bulk...
Success?
Success?
Need Clear?
Need Clear?
Call sai_object_bulk_clear_stats
Call sai_object_bulk...
Success?
Success?
Fill Counters DB
Fill Counters DB
yes
yes
no
no
yes
yes
no
no
no
no
no
no
yes
yes
yes
yes
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/doc/bulk_counter/object_join_counter_group.svg b/doc/bulk_counter/object_join_counter_group.svg new file mode 100644 index 0000000000..5b242c530f --- /dev/null +++ b/doc/bulk_counter/object_join_counter_group.svg @@ -0,0 +1 @@ +
New entry to FlexCounter table
New entry to FlexCou...
Query stats capability
Query stats capabili...
Extract object ID and counter IDs
Extract object ID an...
FlexCounter::addCounter
FlexCounter::addCoun...
Success?
Success?
All Counter IDs support bulk?
All Counter IDs support b...
Bulk not supported
Bulk not supported
yes
yes
no
no
yes
yes
no
no
Find existing bulk context?
Find existing bulk contex...
Update bulk context
Update bulk context
yes
yes
no
no
Create bulk context
Create bulk context
Viewer does not support full SVG 1.1
\ No newline at end of file From 03976a9130a3d78d8fb400b6a2304a399c7f2162 Mon Sep 17 00:00:00 2001 From: kannankvs Date: Wed, 29 Jun 2022 10:38:49 +0530 Subject: [PATCH 41/60] Updated the PR list for a feature (#1023) Updated the PR list for SONiC Generic Update and Rollback feature as it is missed. --- doc/SONiC_202111_Release_Notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/SONiC_202111_Release_Notes.md b/doc/SONiC_202111_Release_Notes.md index d615e75bf5..8f9eb55947 100644 --- a/doc/SONiC_202111_Release_Notes.md +++ b/doc/SONiC_202111_Release_Notes.md @@ -197,7 +197,7 @@ Refer [HLD document](https://github.com/Azure/SONiC/blob/dc4a7ae5be75e8e376f9e95 The SONiC Generic Update and Rollback feature is to standardize the way to do partial updates, to take checkpoints and finally to rollback the configurations for SONiC. Refer [HLD document](https://github.com/ghooo/SONiC/blob/c1f3f3b5427d0cafb3defd93df8b906a26fcee8a/doc/config-generic-update-rollback/SONiC_Generic_Config_Update_and_Rollback_Design.md) and below mentioned PR's for more details. -
**Pull Requests** : [736](https://github.com/Azure/SONiC/pull/736) +
**Pull Requests** : [736](https://github.com/Azure/SONiC/pull/736), [1536](https://github.com/Azure/sonic-utilities/pull/1536), [1599](https://github.com/Azure/sonic-utilities/pull/1599), [1762](https://github.com/Azure/sonic-utilities/pull/1762), [1794](https://github.com/Azure/sonic-utilities/pull/1794), [1831](https://github.com/Azure/sonic-utilities/pull/1831), [1856](https://github.com/Azure/sonic-utilities/pull/1856), [1864](https://github.com/Azure/sonic-utilities/pull/1864), [1885](https://github.com/Azure/sonic-utilities/pull/1885), [1901](https://github.com/Azure/sonic-utilities/pull/1901), [1919](https://github.com/Azure/sonic-utilities/pull/1919), [1923](https://github.com/Azure/sonic-utilities/pull/1923), [1929](https://github.com/Azure/sonic-utilities/pull/1929), [1934](https://github.com/Azure/sonic-utilities/pull/1934), [1969](https://github.com/Azure/sonic-utilities/pull/1969), [1973](https://github.com/Azure/sonic-utilities/pull/1973), [1977](https://github.com/Azure/sonic-utilities/pull/1977), [1981](https://github.com/Azure/sonic-utilities/pll/1981), [1983](https://github.com/Azure/sonic-utilities/pull/1983), [1987](https://github.com/Azure/sonic-utilities/pull/1987), [1988](https://github.com/Azure/sonic-utilities/pull/1988), [2003](https://github.com/Azure/sonic-utilities/pull/2003), [2006](https://github.com/Azure/sonic-utilities/pull/2006), [2008](https://github.com/Azure/sonic-utilities/pull/2008), [2015](https://github.com/Azure/sonic-utilities/pull/2015), [2020](https://github.com/Azure/sonic-utilities/pull/2020) & [2028](https://github.com/Azure/sonic-utilities/pull/2028) #### SRv6 support (Cntd) SRv6 has been widely adopted as an IPv6 based SDN solution, which provides programming ability, TE capabilities, and deployment simplicity to network administrators. With current support from a rich ecosystem, including major ASIC manufactures, networking vendors and open source communities, the deployment of SRv6 is accelerating. This implentation adds SRv6 into SONIC to benefit users in DC as well as beyond DC. From fd1e3105ffa9466c752b40f2ae3b3fb707774193 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Wed, 6 Jul 2022 13:54:51 +0800 Subject: [PATCH 42/60] Port configuration incremental update support (#985) Due to historical reason, portsyncd and portmgrd both handle PORT table changes in CONFIG_DB and write APPL_DB according to configuration change. portmgrd handles fields including "mtu", "admin_status" and "learn_mode"; portsyncd handles all fields. There are a few issues here: portsyncd is designed to listen to kernel port status change and fire the change event to high level, it should not handle CONFIG_DB change. portmgrd is the right place to handle port configuration change according to SONiC architecture. Configuration change for "mtu", "admin_status" and "learn_mode" will be handled twice which is not necessary portsyncd put all configuration to APPL_DB even if user only changes part of them. E.g. user changes "speed" of the port, portsyncd will put configuration like "mtu", "admin_status", "autoneg" to APPL_DB. This is not necessary too. This HLD describes how to fix them. --- .../port-auto-negotiation-design.md | 65 +++++++++++++------ 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/doc/port_auto_neg/port-auto-negotiation-design.md b/doc/port_auto_neg/port-auto-negotiation-design.md index dfebd151c0..65f9e00064 100644 --- a/doc/port_auto_neg/port-auto-negotiation-design.md +++ b/doc/port_auto_neg/port-auto-negotiation-design.md @@ -41,6 +41,7 @@ | 0.1 | | Junchao Chen | Initial version | | 0.2 | | Junchao Chen | Fix review comment | | 0.3 | | Dante (Kuo-Jung) Su | Add support for SFPs and operational states| + | 0.4 | | Junchao Chen | Port incremental configuration | ### Scope This document is the design document for port auto negotiation feature on SONiC. This includes the requirements, CLI change, DB schema change, DB migrator change, yang model change and swss change. @@ -516,26 +517,39 @@ The new SONiC speed setting flow can be described in following pseudo code: port = getPort(alias) if autoneg changed: setPortAutoNeg(port, autoneg) - -if autoneg == true: - speed_list = vector() - if adv_speeds changed or autoneg changed: - // if adv_speeds == "all", leave speed_list empty which means all supported speeds - if adv_speeds != "all": - speed_list = adv_speeds - setPortAdvSpeed(port, speed_list) - - interface_type_list = vector() - if adv_interface_types changed or autoneg changed: - // if adv_interface_types == "all", leave interface_type_list empty which means all supported types - if adv_interface_types != "all" - interface_type_list = adv_interface_types - setPortAdvInterfaceType(port, interface_type_list) -else if autoneg == false: - if speed changed or autoneg changed: - setPortSpeed(port, speed) - if interface_type changed or autoneg changed: + if autoneg == on: + // Due to incremental port configuration support, we might only get an "autoneg" field change from APP_DB. + // In this case, we will need to apply previous saved adv_speeds and adv_interface_types to SAI. If there + // is no previous configuration, will use default empty adv_speeds and adv_interface_types which indicates + // all supported speeds and all supported interface types. + setPortAdvSpeed(port, port.adv_speeds) + setPortAdvInterfaceType(port, port.adv_interface_types) + elif autoneg == off: + // Due to incremental port configuration support, we might only get an "autoneg" field change from APP_DB. + // In this case, we will need to apply previous saved speed and interface_type to SAI. Speed is a mandatory configuration. + // If there is no previous configuration for interface_type, it shall use SAI_PORT_INTERFACE_TYPE_NONE by default. + setPortSpeed(port, port.speed) + setInterfaceType(port, port.interface_type) + +if adv_speeds changed: + if autoneg == on: + setPortAdvSpeed(port, adv_speeds) // empty adv_speeds means all supported speeds + port.adv_speeds = adv_speeds + +if adv_interface_types changed: + if autoneg == on: + setPortAdvInterfaceType(port, adv_interface_types) + port.adv_interface_types = adv_interface_types + +if speed changed: + if autoneg != on: + setPortSpeed(port, speed) // for autoneg is off/not_set, apply the speed to SAI, this is for backward compatible + port.speed = speed + +if interface_type changed: + if autoneg == off: setInterfaceType(port, interface_type) + port.interface_type = interface_type ``` ##### Getting Remote Advertisement @@ -558,9 +572,18 @@ swss will do validation for auto negotiation related fields, although it still C #### portsyncd and portmgrd Consideration -No changes for portsyncd and portmgrd. +Due to historical reason, portsyncd and portmgrd both handle **PORT** table changes in **CONFIG_DB** and write **APPL_DB** according to configuration change. portmgrd handles fields including "mtu", "admin_status" and "learn_mode"; portsyncd handles all fields. There are a few issues here: + +1. portsyncd is designed to listen to kernel port status change and fire the change event to high level, it should not handle **CONFIG_DB** change. portmgrd is the right place to handle port configuration change according to SONiC architecture. +2. Configuration change for "mtu", "admin_status" and "learn_mode" will be handled twice which is not necessary +3. portsyncd put all configuration to **APPL_DB** even if user only changes part of them. E.g. user changes "speed" of the port, portsyncd will put configuration like "mtu", "admin_status", "autoneg" to **APPL_DB**. This is not necessary too. + +To address these issues, a few changes shall be made: -Due to historical reason, portsyncd and portmgrd both handle **PORT** table changes in **CONFIG_DB** and write **APPL_DB** according to configuration change. portmgrd handles fields including "mtu", "admin_status" and "learn_mode"; portsyncd handles the rest fields. +1. portsyncd no longer listen to **CONFIG_DB** changes +2. portmgrd shall be extended to handle all port configuration changes +3. portmgrd shall implement incremental configuration update. It means that portmgrd shall not put configuration to **APPL_DB** if the field is not changed compare to previous value. +4. portsorch shall be changed to handle incremental port configuration changes #### Port Breakout Consideration From d84ba9fe8a9d3f392268a33f93d9c1f1c52b4cf6 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Wed, 6 Jul 2022 17:24:09 +0800 Subject: [PATCH 43/60] Refactor FlexCounter class (#1020) FlexCounter class is a representation of flex counter group which supports querying multiple types of statistic/attributes. It supports multiple statistic/attribute types such as port counter, port debug counter, queue counter, queue attribute and so on. For each statistic/attribute type, it defines several member functions: setXXXCounterList: e.g. setPortCounterList, setPortDebugCounterList removeXXX: e.g. removePort, removeQueue collectXXXCounters: e.g. collectPortCounters, collectQueueCounters collectXXXAttr: e.g. collectQueueAttrs, collectPriorityGroupAttrs so on For different statistic/attribute types, these functions have very similar logic. This design document describes a proposal about how to refactor FlexCounter class by moving duplicate/similar logic to a single place. --- doc/flex_counter/add_counter_object_flow.svg | 1 + doc/flex_counter/add_plugin_flow.svg | 1 + doc/flex_counter/flex_counter_current.svg | 1 + doc/flex_counter/flex_counter_new.svg | 1 + doc/flex_counter/flex_counter_refactor.md | 252 ++++++++++++++++++ .../remove_counter_object_flow.svg | 1 + 6 files changed, 257 insertions(+) create mode 100644 doc/flex_counter/add_counter_object_flow.svg create mode 100644 doc/flex_counter/add_plugin_flow.svg create mode 100644 doc/flex_counter/flex_counter_current.svg create mode 100644 doc/flex_counter/flex_counter_new.svg create mode 100644 doc/flex_counter/flex_counter_refactor.md create mode 100644 doc/flex_counter/remove_counter_object_flow.svg diff --git a/doc/flex_counter/add_counter_object_flow.svg b/doc/flex_counter/add_counter_object_flow.svg new file mode 100644 index 0000000000..aa07a81b5e --- /dev/null +++ b/doc/flex_counter/add_counter_object_flow.svg @@ -0,0 +1 @@ +
FlexCounterManager
FlexCounterManager
FlexCounter
FlexCounter
1.1 getCounterContext
1.1 getCounterContext
CounterContext
CounterContext
1.3 updateSupportedCounters
1.3 updateSupportedCounters
1.4 querySupportedCounters
1.4 querySupportedCounters
1.5 getSupportedCounters
1.5 getSupportedCounters
1.6 add/update counter IDs
1.6 add/update counter IDs
1. addCounter
1. addCounter
return
return
1.2 addObject
1.2 addObject
return
return
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/doc/flex_counter/add_plugin_flow.svg b/doc/flex_counter/add_plugin_flow.svg new file mode 100644 index 0000000000..c697c5a0e0 --- /dev/null +++ b/doc/flex_counter/add_plugin_flow.svg @@ -0,0 +1 @@ +
FlexCounterManager
FlexCounterManager
FlexCounter
FlexCounter
1.1 getCounterContext
1.1 getCounterContext
CounterContext
CounterContext
1.3 save plugin
1.3 save plugin
1. addCounterPlugin
1. addCounterPlugin
return
return
1.2 addPlugin
1.2 addPlugin
return
return
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/doc/flex_counter/flex_counter_current.svg b/doc/flex_counter/flex_counter_current.svg new file mode 100644 index 0000000000..38a5fed9a3 --- /dev/null +++ b/doc/flex_counter/flex_counter_current.svg @@ -0,0 +1 @@ +
FlexCounter
FlexCounter
Port CountersetPortCounterListremovePortgetSupportedPortCountersquerySupportedPortCountersupdateSupportedPortCounterscollectPortCountersaddPortCounterPluginm_portPluginsm_supportedPortCountersm_portCounterIdsMapstruct PortCounterIdsQueue CountersetQueueCounterListremoveQueuegetSupportedQueueCountersquerySupportedQueueCountersupdateSupportedQueueCounterscollectQueueCountersaddQueueCounterPluginm_queuePluginsm_supportedQueueCountersm_queueCounterIdsMapstruct QueueCounterIds
......
......
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/doc/flex_counter/flex_counter_new.svg b/doc/flex_counter/flex_counter_new.svg new file mode 100644 index 0000000000..18dd5a804b --- /dev/null +++ b/doc/flex_counter/flex_counter_new.svg @@ -0,0 +1 @@ +BaseCounterContext+ name: string+ object_type: sai_object_type_t+ plugins: set<string>+ addObject: void virtual+ removeObject: void virtual+ hasObject: bool virtual+ addPlugin: void+ removePlugins: void+ hasPlugin: bool+ runPlugin: void virtual+ collectData: void virtualFlexCounter+ counter_contex_map: map<string, BaseCounterContext>+ getCounterContext: void+ createCounterContext: BaseCounterContext+ hasCounterContext: bool
Relation
Relation
0..n
0..n
1
1
CounterContext<T>+ object_ids_map: map<sai_object_id_t, CounterIds<T>>+ supported_counters: set<T>+ addObject: void overide+ removeObject: void override+ hasObject: bool override+ runPlugin: void override+ collectData: void override+ updateSupportedCounters: void+ getSupportedCounters: void+ querySupportedCounters: void
Inherit
Inherit
AttrContext<T>+ addObject: void override+ collectData: void override
Inherit
Inherit
CounterIds<T>+ rid: sai_object_id_t+ counter_ids: vector<T>+ stats_mode: sai_stats_mode_t (Optional)
Relation
Relation
0..n
0..n
1
1
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/doc/flex_counter/flex_counter_refactor.md b/doc/flex_counter/flex_counter_refactor.md new file mode 100644 index 0000000000..604ddb8b81 --- /dev/null +++ b/doc/flex_counter/flex_counter_refactor.md @@ -0,0 +1,252 @@ +# SONiC FlexCounter Refactor # + +## Table of Content + +### Revision + + | Rev | Date | Author | Change Description | + |:---:|:-----------:|:------------------:|-----------------------------------| + | 0.1 | | Junchao Chen | Initial version | + +### Scope + +This document is the design document for refactoring FlexCounter class in syncd of sonic-sairedis. + +### Definitions/Abbreviations + +N/A + +### Overview + +FlexCounter class is a representation of flex counter group which supports querying multiple types of statistic/attributes. It supports multiple statistic/attribute types such as port counter, port debug counter, queue counter, queue attribute and so on. For each statistic/attribute type, it defines several member functions: + +- setXXXCounterList: e.g. setPortCounterList, setPortDebugCounterList +- removeXXX: e.g. removePort, removeQueue +- collectXXXCounters: e.g. collectPortCounters, collectQueueCounters +- collectXXXAttr: e.g. collectQueueAttrs, collectPriorityGroupAttrs +- so on + +For different statistic/attribute types, these functions have very similar logic. This design document describes a proposal about how to refactor FlexCounter class by moving duplicate/similar logic to a single place. + +#### Challenge + +The major challenge of this refactor is that, different statistic/attributes types may have different SAI type. E.g. type of port counter is sai_port_stat_t, type of queue counter is sai_queue_stat_t, type of queue attribute is sai_port_attr_t. C++ does not allow to put different type of object into the same container. + +#### Benefit + +A POC shows that, the refactor brings a few benefits: + +- Code lines of FlexCounter.cpp change from ~4000 to ~1000 +- Code lines of FlexCounter.h change from ~600 to ~200 +- Supporting new flex counter would requires only change a few places instead of implementing all those setXXXCounterList/removeXXX/collectXXXCounter and so on + +### Requirements + +- The change shall be limited in FlexCounter class +- Public interfaces of FlexCounter class shall keep the same functional +- Other class/component of SONiC shall treat this change as transparent + +### Architecture Design + +Current design of FlexCounter class: + +![flex_counter_current](/doc/flex_counter/flex_counter_current.svg). + +New design: + +![flex_counter_new](/doc/flex_counter/flex_counter_new.svg). + +### High-Level Design + +Changes shall be made into sonic-sairedis. Affected files are: FlexCounter.cpp, FlexCounter.h. This chapter will describe that how the new architecture can perfectly replace the old functions. + +> Note: Code present in this design document is only for demonstrating the design idea, it is not production code. + +#### sonic-sairedis + +##### Store Counter Related Data + +Currently, there are several types of counter related data. + +- Counter IDs map: stores object vid, rid and a list of counter IDs that will be queried. E.g. m_portCounterIdsMap, m_queueCounterIdsMap... +- Plugins: stores redis lua SHA values that will be execute by redis. E.g. m_portPlugins, m_queuePlugins... +- Supported counters: stores supported counter IDs. E.g. m_supportedPortCounters, m_supportedQueueCounters... + +In the new design, each statistic/attribute type is represented by an instance of CounterContext/AttrContext which will be stored in counter_context_map. These data members are moved to CounterContext and AttrContext as data members: + +- object_ids_map +- plugins +- supported_counters + +##### Counter IDs Structure + +Currently, a few similar structures are defined in FlexCounter to represent rid, counter IDs as well as stats mode. + +```cpp +struct QueueCounterIds +{ + QueueCounterIds( + _In_ sai_object_id_t queue, + _In_ const std::vector &queueIds); + + sai_object_id_t queueId; + std::vector queueCounterIds; +}; + +struct PortCounterIds +{ + PortCounterIds( + _In_ sai_object_id_t port, + _In_ const std::vector &portIds); + + sai_object_id_t portId; + std::vector portCounterIds; +}; + +struct BufferPoolCounterIds +{ + BufferPoolCounterIds( + _In_ sai_object_id_t bufferPool, + _In_ const std::vector &bufferPoolIds, + _In_ sai_stats_mode_t statsMode); + + sai_object_id_t bufferPoolId; + sai_stats_mode_t bufferPoolStatsMode; + std::vector bufferPoolCounterIds; +}; + +... +``` + +In new design, two template structures are defined to replaces above structures. The second structure is for those statistic/attribute type which support per instance stats mode; the first structure is for other statistic/attribute type which use counter group level stats mode. + +```cpp +template +struct CounterIds +{ + CounterIds( + _In_ sai_object_id_t rid, + _In_ const std::vector &counter_ids + ): rid(rid), counter_ids(counter_ids) {} + sai_object_id_t rid; + std::vector counter_ids; +}; + +// CounterIds structure contains stats mode, now buffer pool is the only one +// has member stats_mode. +template +struct CounterIds::value>::type > +{ + CounterIds( + _In_ sai_object_id_t rid, + _In_ const std::vector &counter_ids + ): rid(rid), counter_ids(counter_ids) {} + sai_object_id_t rid; + std::vector counter_ids; + sai_stats_mode_t stats_mode; +}; +``` + +##### Handle Counter Object Change + +Each statistic/attribute type can have multiple counter objects. For example, Ethernet0 is a counter object of port statistic; Ethernet0 queue0 is a counter object of queue statistic. The most important information of a counter object are: + +- rid: SAI ID of the object (Real ID) +- vid: Syncd ID of the object (Virtual ID) +- counter_ids: SAI statistic IDs + +FlexCounter handles counter object change so that it queries relevant statistic/attribute from SAI. + +##### Add/Update Counter Object + +Currently, the flow of adding/updating counter object is like this: + +1. FlexCounterManager calls FlexCounter::addCounter +2. In `addCounter`, it calls setXXXCounterList according to the input parameters +3. In `setXXXCounterList`, it updates supported counters +4. In `updateXXXSuportedCounters`, it query statistic capability via SAI API +5. If step 4 fails, it fall back to `getXXXSupportedCounters`, in which is query statistic value for each input counter IDs +6. If supported counters is not empty, update the counter object to a proper counter IDs map + +In the new design, step 3 ~ step 6 are moved to CounterContext class, but the flow/function does not change at all. Here is the chart of the new design(the chart shows the design idea, it does not contain all details): + +![add_counter_object_flow](/doc/flex_counter/add_counter_object_flow.svg). + +For different statistic type, the flow is similar, but not exactly the same. So, there are special cases shall be handled in implementation: + +- Some statistic type query statistic capability via SAI API, while some do not. Need a flag in BaseCounterContext to handle this. +- Some statistic type always query statistic capability, while some only do it once. Need a flag in BaseCounterContext to handle this. +- Some statistic type use `getStats` querying statistic data, while some use `getStatsExt`. Need a flag in BaseCounterContext to handle this. +- Some statistic support per counter object stats mode, while some do not. Plan to use `if constexpr` to handle this. + +##### Remove Counter Object + +Currently, FlexCounter just remove counter object from m_XXXCounterIdsMap. In the new design, the flow/function is the same, but remove operation is moved to CounterContext/AttrContext. In new design, flow is like this: + +![remove_counter_object_flow](/doc/flex_counter/remove_counter_object_flow.svg). + +##### Handle Plugin Change + +Currently, FlexCounter just add plugin to m_XXXPlugins. In new design, the flow/function is the same, but add operation is moved to BaseCounterContext. In new design, the flow is like this: + +![add_plugin_flow](/doc/flex_counter/add_plugin_flow.svg). + +##### Handle Statistic/Attribute Collect + +Currently, FlexCounter collect counters by saving collectXXXCounters function pointer to a map and loop the map. In new design, that map is not needed anymore. New way: + +```cpp +void FlexCounter::collectCounters( + _In_ swss::Table &countersTable) +{ + for (const auto &it : m_counterContext) + { + it->second->collectData(countersTable); + } + + countersTable.flush(); +} +``` + +Currently, FlexCounter run redis plugins by looping each m_XXXPlugins one by one. New way: + +```cpp +void FlexCounter::runPlugins( + _In_ swss::DBConnector& counters_db) +{ + const std::vector argv = + { + std::to_string(counters_db.getDbId()), + COUNTERS_TABLE, + std::to_string(m_pollInterval) + }; + + for (const auto &it : m_counterContext) + { + it->second->runPlugin(counters_db, argv); + } +} +``` + +### SAI API + +N/A + +### Configuration and management + +N/A + +### Warmboot and Fastboot Design Impact + +N/A + +### Restrictions/Limitations + +N/A + +### Testing Requirements/Design + +#### Unit Test cases + +TBD diff --git a/doc/flex_counter/remove_counter_object_flow.svg b/doc/flex_counter/remove_counter_object_flow.svg new file mode 100644 index 0000000000..ac8d1d56d7 --- /dev/null +++ b/doc/flex_counter/remove_counter_object_flow.svg @@ -0,0 +1 @@ +
FlexCounterManager
FlexCounterManager
FlexCounter
FlexCounter
1.1 getCounterContext
1.1 getCounterContext
CounterContext
CounterContext
1.3 remove counter IDs
1.3 remove counter IDs
1. removeCounter
1. removeCounter
return
return
1.2 removeObject
1.2 removeObject
return
return
Viewer does not support full SVG 1.1
\ No newline at end of file From 23555cd573d1bd12701910e97c59012637dded21 Mon Sep 17 00:00:00 2001 From: Xuhui Miao Date: Thu, 7 Jul 2022 22:24:51 +0800 Subject: [PATCH 44/60] Add fips cli --- doc/fips/SONiC-OpenSSL-FIPS-140-3.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/fips/SONiC-OpenSSL-FIPS-140-3.md b/doc/fips/SONiC-OpenSSL-FIPS-140-3.md index cf84870478..9831679a5c 100644 --- a/doc/fips/SONiC-OpenSSL-FIPS-140-3.md +++ b/doc/fips/SONiC-OpenSSL-FIPS-140-3.md @@ -5,7 +5,7 @@ | Rev | Date | Author | Change Description | | :---: | :--------: | :--------: | ------------------ | | 0.1 | 2022-02-22 | Xuhui Miao | Initial version | -| 0.2 | 2022-05-07 | Xuhui Miao | Update Fips config | +| 0.2 | 2022-07-07 | Xuhui Miao | Update Fips config | ## Table of Contents - [Abbreviation](#abbreviation) @@ -24,6 +24,7 @@ * [Enable FIPS on system level](#Enable-FIPS-on-system-level) * [Enable FIPS on application level](#Enable-FIPS-on-application-level) * [SONiC Build Options](#SONiC-Build-Options) +- [SONiC FIPS Command lines](#SONiC-FIPS-Command-lines) - [Q&A](#Q&A) @@ -179,6 +180,16 @@ ENABLE_FIPS ?= n ``` If the ENABLE_FIPS_FEATURE is not set, then the option ENABLE_FIPS is useless. +## SONiC FIPS Command lines +### The command line to enable or disable FIPS +sonic-installer set-fips [--enable-fips=[true|false]] + +### The command line to show FIPS status +sonic-installer get-fips + +Returns the following message: Fips is enabled/disabled. + + ## Q&A ### Does SymCrypt use Linux Kernel crypto module? SymCrypt on Linux does not rely on Kernel crypt for FIPS certification today. \ No newline at end of file From 4b811045718b2ac16ed2033414b117897483b482 Mon Sep 17 00:00:00 2001 From: Xuhui Miao Date: Fri, 8 Jul 2022 09:22:21 +0800 Subject: [PATCH 45/60] Change the fips command line parameters --- doc/fips/SONiC-OpenSSL-FIPS-140-3.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/fips/SONiC-OpenSSL-FIPS-140-3.md b/doc/fips/SONiC-OpenSSL-FIPS-140-3.md index 9831679a5c..642e0fbc38 100644 --- a/doc/fips/SONiC-OpenSSL-FIPS-140-3.md +++ b/doc/fips/SONiC-OpenSSL-FIPS-140-3.md @@ -182,12 +182,16 @@ If the ENABLE_FIPS_FEATURE is not set, then the option ENABLE_FIPS is useless. ## SONiC FIPS Command lines ### The command line to enable or disable FIPS -sonic-installer set-fips [--enable-fips=[true|false]] +sonic-installer set-fips [--enable-fips|--disable-fips] + +If the image is not specified, the next boot image will be used. +The default behavior is to enable FIPS, if none of the option --enable-fips or --disable-fips specified. ### The command line to show FIPS status sonic-installer get-fips -Returns the following message: Fips is enabled/disabled. +Returns the following message: FIPS is enabled/disabled. +If the image is not specified, the next boot image will be used. ## Q&A From f704a367bd3504b3d0277ffecde0a5bd62800940 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Tue, 12 Jul 2022 16:56:46 -0700 Subject: [PATCH 46/60] wording change --- doc/dualtor/active_active_hld.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/dualtor/active_active_hld.md b/doc/dualtor/active_active_hld.md index 3a3d5d44ff..92144a61a0 100644 --- a/doc/dualtor/active_active_hld.md +++ b/doc/dualtor/active_active_hld.md @@ -50,7 +50,7 @@ This document provides the high level design of SONiC dual toR solution, support There are a certain number of racks in a row, each rack will have 2 ToRs, and each row will have 8 Tier One (T1s) network devices. Each server will have a NIC connected to 2 ToRs with 100 Gbps DAC cables. In this design: -* Both upper ToR (labeled as UT0) and lower ToR (labeled as LT0) will advertise same VLAN to upstream T1s, each T1 will see 2 available next hops for the VLAN. +* Both upper ToR (labeled as UT0) and lower ToR (labeled as LT0) will advertise same IP to upstream T1s, each T1 will see 2 available next hops for the VLAN. * Both UT0 and LT0 are expected to carry traffic in normal scenarios. * The software stack on server host will see 200 Gbps NIC. From 7c5ac119a3fd72678c9fa0eb41a9cd13f6d0efc9 Mon Sep 17 00:00:00 2001 From: davidpil2002 <91657985+davidpil2002@users.noreply.github.com> Date: Thu, 14 Jul 2022 09:22:22 +0300 Subject: [PATCH 47/60] [password-hardening] Update compilation chapter (#1027) The Password Hardening compilation chapter is updated to include recent decisions taken during the code review. The feature is always compiled when building the image, and is disabled by default. This modification was done because in general the user always wants to have the possibility to enable/disable the feature and if the user for some reason does not compile the feature, this will enforce him to burn the image again. In addition, the code of the feature exists in hostcfgd and this daemon is coded in python so it does not really influence the compilation time because python code is an interpreter.ng HLD --- doc/passw_hardening/hld_password_hardening.md | 18 +-- doc/passw_hardening/sonic-passwh.yang | 127 ++++++++---------- 2 files changed, 62 insertions(+), 83 deletions(-) diff --git a/doc/passw_hardening/hld_password_hardening.md b/doc/passw_hardening/hld_password_hardening.md index a4f36e920e..477f9e271b 100644 --- a/doc/passw_hardening/hld_password_hardening.md +++ b/doc/passw_hardening/hld_password_hardening.md @@ -49,7 +49,7 @@ ### 1.2. Scope -This password hardening hld doc described the requirements, architecture and configuration details of password hardening feature in switches Sonic OS based. +This password hardening hld doc described the requirements, architecture and configuration details of password hardening feature in switches SONIC OS based. ### 1.3. Definitions/Abbreviations PW - password @@ -100,7 +100,7 @@ See linux 3d party component chapter for more description ![password hardening flow](ph_diagram.jpg) #### 1.7.1. Flow description: -When the feature is enabled, Users by using Sonic CLI will set new password policies/configuration (see PW options below) saving those in CONF_DB in PASSWH_TABLE. +When the feature is enabled, Users by using SONIC CLI will set new password policies/configuration (see PW options below) saving those in CONF_DB in PASSWH_TABLE. The daemon named hostcfgd daemon will be extended to listen to password hardening policies/configurations from PASSWH table, parse the inputs and set the new policies to PAM lib using pam-cracklib, chage, pwhistory libs. @@ -231,15 +231,11 @@ For saving password with sha512, need to modify the /etc/pam.d/system-auth-a fil ### 1.8. Init Flow #### 1.8.1. Compilation -This feature will be enabled by default in the compilation stage, this means that it will be compiled, and will be not compiled only when the user specifically adds the relevant compilation flag "INCLUDE_PASSWH=n" in sonic-buildimage/rules/config file. +This feature will be compiled always, but it will be disabled by default (from running time point of view). +Meaning that the switch will boot with an image that includes the feature code and the status of the feature will be disabled, so no password hardening policies are configured in the system. +This default configuration can be founded in init_cfg.json.j2. -In addition, the feature will have CLI as a "plugin", meaning that when the feature is not compiled will be not appear in the CLI of the switch, and vice versa. - -Feature enable details: -when compilation flag is enabled(default value), users can still enable or disable this feature in runtime. -By default if the feature was compiled, the feature status will be disabled, meaning that the switch will boot with the feature compiled, but disable. -the disable default configuration can be founded in init_cfg.json.j2 file. -In case, the user want to enable the feature it can be done by using the Sonic CLI (details in CLI chapter). +In addition, the user can enable/disable the feature in running time by using the SONIC CLI (details in CLI chapter). #### 1.8.2. Dependencies Service dependencies: same dependencies as HOSTCFGD, INIT_CONF and NTP service. @@ -840,4 +836,4 @@ An example password section would be: ##### FILES File with password history - /etc/security/opasswd \ No newline at end of file + /etc/security/opasswd diff --git a/doc/passw_hardening/sonic-passwh.yang b/doc/passw_hardening/sonic-passwh.yang index b053aa46d0..120c98c51a 100644 --- a/doc/passw_hardening/sonic-passwh.yang +++ b/doc/passw_hardening/sonic-passwh.yang @@ -1,7 +1,7 @@ module sonic-passwh { yang-version 1.1; namespace "http://github.com/Azure/sonic-passwh"; - prefix passwh; + prefix password; description "PASSWORD HARDENING YANG Module for SONiC OS"; @@ -18,75 +18,58 @@ module sonic-passwh { } } - container PASSWH { - description "PASSWORD HARDENING part of config_db.json"; - container POLICIES { - leaf state { - description "state of the feature"; - type feature_state; - default "disabled"; - } - leaf expiration { - description "expiration time (days unit)"; - default 180; - type uint32 { - range 1..365; - } - } - leaf expiration_warning { - description "expiration warning time (days unit)"; - default 15; - type uint8 { - range 1..30; - } - } - leaf history_cnt { - description "num of old password that the system will recorded"; - default 10; - type uint8 { - range 1..100; - } - } - leaf len_max { - description "password max length"; - default 64; - type uint8 { - range 64..80; - } - } - leaf len_min { - description "password min length"; - default 8; - type uint8 { - range 1..32; - } - } - leaf username_passw_match{ - description "username password match"; - default true; - type boolean; - } - leaf lower_class{ - description "password lower chars policy"; - default true; - type boolean; - } - leaf upper_class{ - description "password upper chars policy"; - default true; - type boolean; - } - leaf digits_class{ - description "password digits chars policy"; - default true; - type boolean; - } - leaf special_class{ - description "password special chars policy"; - default true; - type boolean; - } - }/*container policies */ - } /* container PASSWH */ + container PASSW_HARDENING { + description "PASSWORD HARDENING part of config_db.json"; + container POLICIES { + leaf state { + description "state of the feature"; + type feature_state; + } + leaf expiration { + description "expiration time (days unit)"; + type uint16 { + range 1..365; + } + } + leaf expiration_warning { + description "expiration warning time (days unit)"; + type uint8 { + range 1..30; + } + } + leaf history_cnt { + description "num of old password that the system will recorded"; + type uint8 { + range 1..100; + } + } + leaf len_min { + description "password min length"; + type uint8 { + range 1..32; + } + } + leaf reject_user_passw_match{ + description "username password match"; + type boolean; + } + leaf lower_class{ + description "password lower chars policy"; + type boolean; + } + leaf upper_class{ + description "password upper chars policy"; + type boolean; + } + leaf digits_class{ + description "password digits chars policy"; + type boolean; + } + leaf special_class{ + description "password special chars policy"; + type boolean; + } + }/*container policies */ + } /* container PASSWH */ }/* container sonic-passwh */ -}/* end of module sonic-passwh */ \ No newline at end of file +}/* end of module sonic-passwh */ From 8297b42c049b424e856b5d3e420b36bf074a6384 Mon Sep 17 00:00:00 2001 From: kannankvs Date: Wed, 20 Jul 2022 10:19:03 +0530 Subject: [PATCH 48/60] Updated the Marvell Logo (#1025) Updated the Marvell Logo as requested --- assets/img/all_partners2_1920x1320.jpg | Bin 169420 -> 169567 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/img/all_partners2_1920x1320.jpg b/assets/img/all_partners2_1920x1320.jpg index da9bd237b3e7e00c84be36494f1150f0bb8c2af4..a600d5098e287d4c9130ea60d594cb25b55055e8 100644 GIT binary patch delta 160369 zcmX_nXH-+q7i|y_=^dm-rFW!Cje<1!A&AmTRFn>pCLkeKK#Ei$0tyOBkuK6Zk=_KP z_YwjqJpqIZgz)lzZ>{&?en{53Gjq?JbLQ-Q_WUZLTPmgd(Rv9;&v)+9-}iFLdJoz6 z`_HAz55_{0{0pO3l2Dcjv8WvN#9jZdjxDAQu^WHBj(e?Onvd)uXprbSzHCgH+k&RL zUZ=CbMtw1TviHi7#1G|^0k++aa_`g z3Z~Vatv51g!LYl}$h`7B^7`)Gw~&nzdU#+z+hpWor4=BL zlIK~18LnK5=)D%Z!9j3rq5EAzZO*ij_1{-Hy3B^0I&n;WDubBZR^wbFDWB)9jA%Xy{sIQJw@MRs%kq>wN;w{ zw#XD7tN7f)Yh;tq(yklW=;_l}Ih9{Pipfg~4@bXi(Mgw=q__nPF+%Prg#~&a_LgVD zJj>?>OwO}&y}0#_L+!dAcCAa__d`5prWfvH@%8HrW|-d0&De%{$<3<6W^h=|WBiG) z2lwESmJ0Wp?NbGTXoo@yzpdAbDN_3eE6zp5NF#zkbkuf$$*Zj%NA(Grr*#g3iUDP& ze2%x}WN``R|49R8A05{G<-1D`h|SR9Aasn!xjT;|jm<#d3^cgCS?ykn#QLp2?q(Yy z4p}XDU2I*a94JxVgW#W8MBc8z69p+r!>V|0Y0J6Ne+2Cl zSZp3-ZkAJCK-!>y%LRmPvk{ez)0=1&3yL;p8(Rkyg7hz=&2rsTtLDRM9cGZP38;8mGswutFf1AyH}v{Ob8}AjoWs0zke>jKI8CS^6-m4 zX&H7erEm8NL0%Pv0n6DWwh>}z4mj2|I~Ct5j?}^L49^}ev4hzbgOeXfcAW!mUao0J zmaYV#w@-4;u3O9@2chbY+xWqwCCOr5_&$HBNgGfYDjqMyMSIKtP0JAciXXtrMWX0~ zoVB>yNIbuh5;=3pYtwGL{wgXJghZjY76x~Iqdt_gkyo9DG{WyiUO-$HjEyF+HRH0) zx3!0zT&^+Kx-LBDzO|{Db~o7$ba3jXy$rPY;V|7h+{>`n<;pwmxPiJlK69nEv~}I% zr+T}CiCUFL5O%l-Y7n6Pw>M{nW60(}`Y;n8o+8`)Go_)T`Ud?u;o7dbo@uwvS3i>}4y zdD=WTi!0kY^}XA^QnO(l79QrcBgKTsfxo5Nf=Y;DgQT~mTNbJMbO~+2R^H>}U=i z6%#u-mwi2o2x9+RKMnZu%xa>%^sq(lzq*v&{i99)@Wt7y<4t|SK)g$&{<0_l?v$9S9-)KUh`QgKozla1ozL7EUb>2Yq`7@-mk}_^#y^ny z@Q)c3gLluAt=TwbVvlP7ZqB8SZ;Y|r5%9g)TkfIICl*n3pDpmAU6wZet;8FjR?{jP z=8e4h-Voe3X00(jvebPiF4mS=q6r|eZa;11Ad^&94FkpHekQSP zzMI~_@V2tMbEngIn%M<4nWh;rSC)2W<$l?7e7lnURuGCeh;Sw_)s$_h8$|EmY@EmU z5JGiTkyl@TA5*)+k!D7FOXT$)e0X>}`2s>U0X{#|BPRfEZE>Rgg!Eo1=|+&Cm-Er^ zqd2q7J|K;c&$__Q&1>eD2%oGf74w0M&(H6$qwC<-iirn_R`JZ1sMq2y|Ge)|?GKEO+Y(@H-U- zpA+WVFud4iblajV9up@tW@El{=wQou$LnL5B*5SKi~Aazs?#m))Q{z;2^a%W1XqQ1 zc(@`KR=vb7O_)+ zuQg7%VFQPQ$m|OU_06{;WV=VnLEXJCAa8K((IN&!!Wirvh;%W%{+{r#V`#3cY4*t1h8|dmW;|0(J1BLO1^N->dS0bR5>;_~)L=yCtZGI8qtJg-GTwXJ zcg?TlA3RQ&y*qRLkypP;74bngR#JGgW>VQN7bH7*&u7N7V1)r8AmF+G zhpdk=89g$6l28ARmvQI8phBK6eHgT?9|9hDSb?~gfK+Xbb-J0h>r{)T7%`4Xbf}A*)auYN3QXw<~fKu1Pyg7r8h;wZ4ED$g~Z+lbkTi?=B#f={q84Iv~vo zstljo1*i9iUYQ2hPrHFf1hYoB)mB>mlxm&DS#$ROAPU)z>_%-8Qu{`kWg6>vzA{(F z#CA}_8h?O2Ow@75{8TXWOw;HLj`RV`2yz|A&{|lhmgo}pd?&v&@PTby)HrH{KShc| zHe9RZYVZ7f)~!`y8`&dh$srhnn$G^wv%_5�j{=Vo<_B_~hv9z7*kFwSx4Bbf&Fh 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%0Aqe>7=*vhd9; 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

B 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

!SyCMG|4DNt4 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 From a7e308dcc41fc0d789b8a89b75b3129c0de327cd Mon Sep 17 00:00:00 2001 From: kannankvs Date: Wed, 20 Jul 2022 10:24:18 +0530 Subject: [PATCH 49/60] Updated Barefoot to Intel as ASIC Vendor (#1032) Updated Barefoot to Intel as ASIC Vendor for Supported device and platform html file. --- Supported-Devices-and-Platforms.html | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/Supported-Devices-and-Platforms.html b/Supported-Devices-and-Platforms.html index fe11a034c5..55a3fcaa63 100644 --- a/Supported-Devices-and-Platforms.html +++ b/Supported-Devices-and-Platforms.html @@ -471,7 +471,7 @@

Barefoot +Intel Tofino 32x100G + 2x10G @@ -479,7 +479,7 @@

Barefoot +Intel Tofino 64x100G @@ -509,25 +509,17 @@

Barefoot -P4 Emulated -Configurable - - - -Barefoot +Accton Wedge 100BF-32 -Barefoot +Intel Tofino 32x100G -Barefoot +Accton Wedge 100BF-65X -Barefoot +Intel Tofino 32x100G @@ -837,7 +829,7 @@

Barefoot +Intel Tofino 32x100G @@ -861,7 +853,7 @@

Barefoot +Intel Tofino 64x100G @@ -1093,7 +1085,7 @@

Barefoot +Intel Tofino 48x25G + 6x100G From a05ce90fc8ed65f471c474007ad6bb77507c0f4e Mon Sep 17 00:00:00 2001 From: kannankvs Date: Wed, 20 Jul 2022 10:24:47 +0530 Subject: [PATCH 50/60] Updated Barefoot to Intel for md file (#1033) Updated Barefoot to Intel for md file for supported device platform for md file. --- supported_devices_platforms_md.sh | 151 +++++++++++++++--------------- 1 file changed, 75 insertions(+), 76 deletions(-) diff --git a/supported_devices_platforms_md.sh b/supported_devices_platforms_md.sh index b9c4efb779..359013351c 100644 --- a/supported_devices_platforms_md.sh +++ b/supported_devices_platforms_md.sh @@ -96,85 +96,84 @@ echo "| 24 | Arista | 7050CX3-32S | Broadcom | Trident 3 echo "| 25 | Arista | 7060CX-32S | Broadcom | Tomahawk | 32x100G + 2x10G | [SONiC-Aboot-Broadcom]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-aboot-barefoot.swi/')) |" >> supported_devices_platforms.md echo "| 26 | Arista | 7060DX4-32 | Broadcom | Tomahawk 3 | 32x400G + 2x10G | [SONiC-Aboot-Broadcom]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-aboot-barefoot.swi/')) |" >> supported_devices_platforms.md echo "| 27 | Arista | 7060PX4-32 | Broadcom | Tomahawk 3 | 32x400G + 2x10G | [SONiC-Aboot-Broadcom]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-aboot-barefoot.swi/')) |" >> supported_devices_platforms.md -echo "| 28 | Arista | 7170-32CD | Barefoot | Tofino | 32x100G + 2x10G | [SONiC-Aboot-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-aboot-barefoot.swi/')) |" >> supported_devices_platforms.md -echo "| 29 | Arista | 7170-64C | Barefoot | Tofino | 64x100G + 2x10G | [SONiC-Aboot-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-aboot-barefoot.swi/')) |" >> supported_devices_platforms.md +echo "| 28 | Arista | 7170-32CD | Intel | Tofino | 32x100G + 2x10G | [SONiC-Aboot-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-aboot-barefoot.swi/')) |" >> supported_devices_platforms.md +echo "| 29 | Arista | 7170-64C | Intel | Tofino | 64x100G + 2x10G | [SONiC-Aboot-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-aboot-barefoot.swi/')) |" >> supported_devices_platforms.md echo "| 30 | Arista | 7260CX3-64 | Broadcom | Tomahawk 2 | 64x100G + 2x10G | [SONiC-Aboot-Broadcom]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-aboot-barefoot.swi/')) |" >> supported_devices_platforms.md echo "| 31 | Arista | 7280CR3-32D4 | Broadcom | Jericho 2 | 32x100G + 4x400G | [SONiC-Aboot-Broadcom]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-aboot-barefoot.swi/')) |" >> supported_devices_platforms.md echo "| 32 | Arista | 7280CR3-32P4 | Broadcom | Jericho 2 | 32x100G + 4x400G | [SONiC-Aboot-Broadcom]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-aboot-barefoot.swi/')) |" >> supported_devices_platforms.md -echo "| 33 | Barefoot | SONiC-P4 | Barefoot | P4 Emulated | Configurable | [SONiC-P4](https://sonic-build.azurewebsites.net/ui/sonic/Pipelines) |" >> supported_devices_platforms.md -echo "| 34 | Barefoot | Wedge 100BF-32 | Barefoot | Tofino | 32x100G | [SONiC-ONIE-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-barefoot.bin/')) |" >> supported_devices_platforms.md -echo "| 35 | Barefoot | Wedge 100BF-65X | Barefoot | Tofino | 32x100G | [SONiC-ONIE-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-barefoot.bin/')) |" >> supported_devices_platforms.md -echo "| 36 | Celestica | DX010 | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 37 | Celestica | E1031 | Broadcom | Helix4 | 48x1G + 4x10G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 38 | Celestica | midstone-200i | Marvell | Teralynx 7 | 128x100G |[SONiC-ONIE-Innovium]($(echo "${ARTF_INNO}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-innovium-dbg.bin/')) |" >> supported_devices_platforms.md -echo "| 39 | Celestica | Silverstone | Broadcom | Tomahawk 3 | 32x400G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 40 | Celestica | Seastone_2 | Broadcom | Trident 3 | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 41 | Centec | E582-48X2Q | Centec | Goldengate | 48x10G + 2x40G + 4x100G | [SONiC-ONIE-Centec]($(echo "${ARTF_CTC}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-centec.bin/')) |" >> supported_devices_platforms.md -echo "| 42 | Centec | E582-48X6Q | Centec | Goldengate | 48x10G + 6x40G | [SONiC-ONIE-Centec]($(echo "${ARTF_CTC}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-centec.bin/')) |" >> supported_devices_platforms.md -echo "| 43 | Cig | CS6436-56P | Nephos | NP8366 | 48x25G + 8x100G | [SONiC-ONIE-Nephos]($(echo "${ARTF_NPH}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-nephos.bin/')) |" >> supported_devices_platforms.md -echo "| 44 | Cig | CS5435-54P | Nephos | NP8363 | 10GX48,100GX6 | [SONiC-ONIE-Nephos]($(echo "${ARTF_NPH}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-nephos.bin/')) |" >> supported_devices_platforms.md -echo "| 45 | Cig | CS6436-54P | Nephos | NP8365 | 25GX48,100GX6 | [SONiC-ONIE-Nephos]($(echo "${ARTF_NPH}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-nephos.bin/')) |" >> supported_devices_platforms.md -echo "| 46 | Dell | N3248PXE | Broadcom | Trident 3.X5 | 48x10GCU+4x25G-2x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 47 | Dell | N3248TE | Broadcom | Trident 3.X3 | 48x1G+4x10G-2x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 48 | Dell | S5212F | Broadcom | Trident 3.X5 | 12x25G+3x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 49 | Dell | S5224F | Broadcom | Trident 3.X5 | 24x25G+4x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 50 | Dell | S5232F-ON | Broadcom | Trident 3 | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 51 | Dell | S5248F-ON | Broadcom | Trident 3-2T | 48x25G,4x100G,2x200G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 52 | Dell | s5296F | Broadcom | Trident 3 | 96x25G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 53 | Dell | S6000-ON | Broadcom | Trident 2 | 32x40G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 54 | Dell | S6100-ON | Broadcom | Tomahawk | 64x40G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 55 | Dell | Z9100-ON | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 56 | Dell | Z9264F-ON | Broadcom | Tomahawk 2 | 64x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 57 | Dell | Z9332F-ON | Broadcom | Tomahawk 3 | 32x400G,2x10G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 58 | Dell | Z9332f-C32 | Broadcom | Tomahawk 3 | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 59 | Delta | AG5648 | Broadcom | Tomahawk | 48x25G + 6x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 60 | Delta | AG9032V1 | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 61 | Delta | AG9032V2A | Broadcom | Trident 3 | 32x100G + 1x10G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 62 | Delta | AG9064 | Broadcom | Tomahawk 2 | 64x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 63 | Delta | et-c032if | Marvell | Teralynx 7 | 32x400G |[SONiC-ONIE-Innovium]($(echo "${ARTF_INNO}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-innovium-dbg.bin/')) |" >> supported_devices_platforms.md -echo "| 64 | Delta | ET-6448M | Marvell | Prestera 98DX3255 | 48xGE + 4x10G | [SONiC-ONIE-Marvell]($(echo "${ARTF_MRV}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-marvell-armhf.bin/')) |" >> supported_devices_platforms.md -echo "| 65 | Delta | agc032 | Broadcom | Tomahawk3 | 32x400G + 2x10G | [SONiC-ONIE-Marvell]($(echo "${ARTF_MRV}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-marvell-armhf.bin/')) |" >> supported_devices_platforms.md -echo "| 66 | Embedway | ES6220 (48x10G) | Centec | Goldengate | 48x10G + 2x40G + 4x100G | [SONiC-ONIE-Centec]($(echo "${ARTF_CTC}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-centec.bin/')) |" >> supported_devices_platforms.md -echo "| 67 | Embedway | ES6428A-X48Q2H4 | Centec | Goldengate | 4x100G + 2x40G + 48x10G | [SONiC-ONIE-Centec]($(echo "${ARTF_CTC}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-centec.bin/')) |" >> supported_devices_platforms.md -echo "| 68 | Facebook | Wedge 100-32X | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 69 | Ingrasys | S8810-32Q | Broadcom | Trident 2 | 32x40G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 70 | Ingrasys | S8900-54XC | Broadcom | Tomahawk | 48x25G + 6x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 71 | Ingrasys | S8900-64XC | Broadcom | Tomahawk | 48x25G + 16x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 72 | Ingrasys | S9100-32X | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 73 | Ingrasys | S9130-32X | Nephos | Taurus | 32x100G | [SONiC-ONIE-Nephos]($(echo "${ARTF_NPH}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-nephos.bin/')) |" >> supported_devices_platforms.md -echo "| 74 | Ingrasys | S9180-32X | Barefoot | Tofino | 32x100G | [SONiC-ONIE-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-barefoot.bin/')) |" >> supported_devices_platforms.md -echo "| 75 | Ingrasys | S9200-64X | Broadcom | Tomahawk 2 | 64x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 76 | Ingrasys | S9230-64X | Nephos | Taurus | 64x100G | [SONiC-ONIE-Nephos]($(echo "${ARTF_NPH}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-nephos.bin/')) |" >> supported_devices_platforms.md -echo "| 77 | Ingrasys | S9280-64X | Barefoot | Tofino | 64x100G | [SONiC-ONIE-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-barefoot.bin/')) |" >> supported_devices_platforms.md -echo "| 78 | Inventec | D6254QS | Broadcom | Trident 2 | 72x10G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 79 | Inventec | D6356 | Broadcom | Trident 3 | 48x25G + 8x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 80 | Inventec | D6556 | Broadcom | Trident 3 | 48x25G + 8x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 81 | Inventec | D7032Q | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 82 | Inventec | D7054Q | Broadcom | Tomahawk | 48x25G + 6x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 83 | Inventec | D7264Q | Broadcom | Tomahawk 2 | 64x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 84 | Juniper Networks| QFX5210-64C | Broadcom | Tomahawk 2 | 64x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 85 | Juniper Networks| QFX5200-32C-S | Broadcom | Tomahawk 1 | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 86 | Marvell | RD-ARM-48XG6CG-A4 | Marvell | Prestera 98EX54xx | 6x100G+48x10G | [SONiC-ONIE-Marvell]($(echo "${ARTF_MRV}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-marvell-armhf.bin/')) |" >> supported_devices_platforms.md -echo "| 87 | Marvell | RD-BC3-4825G6CG-A4 | Marvell | Prestera 98CX84xx | 6x100G+48x25G | [SONiC-ONIE-Marvell]($(echo "${ARTF_MRV}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-marvell-armhf.bin/')) |" >> supported_devices_platforms.md -echo "| 88 | Marvell | 98cx8580 | Marvell | Prestera CX | 32x400G + 16x400G | [SONiC-ONIE-Marvell]($(echo "${ARTF_MRV}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-marvell-armhf.bin/')) |" >> supported_devices_platforms.md -echo "| 89 | Nvidia | SN2010 | Nvidia | Spectrum | 18x25G + 4x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md -echo "| 90 | Nvidia | SN2100 | Nvidia | Spectrum | 16x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md -echo "| 91 | Nvidia | SN2410 | Nvidia | Spectrum | 48x25G + 8x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md -echo "| 92 | Nvidia | SN2700 | Nvidia | Spectrum | 32x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md -echo "| 93 | Nvidia | SN3420 | Nvidia | Spectrum 2 | 48x25G + 12x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md -echo "| 94 | Nvidia | SN3700 | Nvidia | Spectrum 2 | 32x200G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md -echo "| 95 | Nvidia | SN3700C | Nvidia | Spectrum 2 | 32x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md -echo "| 96 | Nvidia | SN3800 | Nvidia | Spectrum 2 | 64x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md -echo "| 97 | Nvidia | SN4600C | Nvidia | Spectrum 3 | 64x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md -echo "| 98 | Nvidia | SN4700 | Nvidia | Spectrum 3 | 32x400G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md -echo "| 99 | Mitac | LY1200-B32H0-C3 | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 100 | Pegatron | Porsche | Nephos | Taurus | 48x25G + 6x100G | [SONiC-ONIE-Nephos]($(echo "${ARTF_NPH}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-nephos.bin/')) |" >> supported_devices_platforms.md -echo "| 101 | Quanta | T3032-IX7 | Broadcom | Trident 3 | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 102 | Quanta | T4048-IX8 | Broadcom | Trident 3 | 48x25G + 8x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 103 | Quanta | T4048-IX8C | Broadcom | Trident 3 | 48x25G + 8x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 104 | Quanta | T7032-IX1B | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 105 | Quanta | T9032-IX9 | Broadcom | Tomahawk 3 | 32x400G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md -echo "| 106 | Wnc | OSW1800 | Barefoot | Tofino | 48x25G + 6x100G | [SONiC-ONIE-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-barefoot.bin/')) |" >> supported_devices_platforms.md +echo "| 33 | Accton | Wedge 100BF-32 | Intel | Tofino | 32x100G | [SONiC-ONIE-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-barefoot.bin/')) |" >> supported_devices_platforms.md +echo "| 34 | Accton | Wedge 100BF-65X | Intel | Tofino | 32x100G | [SONiC-ONIE-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-barefoot.bin/')) |" >> supported_devices_platforms.md +echo "| 35 | Celestica | DX010 | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 36 | Celestica | E1031 | Broadcom | Helix4 | 48x1G + 4x10G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 37 | Celestica | midstone-200i | Marvell | Teralynx 7 | 128x100G |[SONiC-ONIE-Innovium]($(echo "${ARTF_INNO}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-innovium-dbg.bin/')) |" >> supported_devices_platforms.md +echo "| 38 | Celestica | Silverstone | Broadcom | Tomahawk 3 | 32x400G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 39 | Celestica | Seastone_2 | Broadcom | Trident 3 | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 40 | Centec | E582-48X2Q | Centec | Goldengate | 48x10G + 2x40G + 4x100G | [SONiC-ONIE-Centec]($(echo "${ARTF_CTC}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-centec.bin/')) |" >> supported_devices_platforms.md +echo "| 41 | Centec | E582-48X6Q | Centec | Goldengate | 48x10G + 6x40G | [SONiC-ONIE-Centec]($(echo "${ARTF_CTC}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-centec.bin/')) |" >> supported_devices_platforms.md +echo "| 42 | Cig | CS6436-56P | Nephos | NP8366 | 48x25G + 8x100G | [SONiC-ONIE-Nephos]($(echo "${ARTF_NPH}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-nephos.bin/')) |" >> supported_devices_platforms.md +echo "| 43 | Cig | CS5435-54P | Nephos | NP8363 | 10GX48,100GX6 | [SONiC-ONIE-Nephos]($(echo "${ARTF_NPH}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-nephos.bin/')) |" >> supported_devices_platforms.md +echo "| 44 | Cig | CS6436-54P | Nephos | NP8365 | 25GX48,100GX6 | [SONiC-ONIE-Nephos]($(echo "${ARTF_NPH}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-nephos.bin/')) |" >> supported_devices_platforms.md +echo "| 45 | Dell | N3248PXE | Broadcom | Trident 3.X5 | 48x10GCU+4x25G-2x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 46 | Dell | N3248TE | Broadcom | Trident 3.X3 | 48x1G+4x10G-2x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 47 | Dell | S5212F | Broadcom | Trident 3.X5 | 12x25G+3x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 48 | Dell | S5224F | Broadcom | Trident 3.X5 | 24x25G+4x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 49 | Dell | S5232F-ON | Broadcom | Trident 3 | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 50 | Dell | S5248F-ON | Broadcom | Trident 3-2T | 48x25G,4x100G,2x200G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 51 | Dell | s5296F | Broadcom | Trident 3 | 96x25G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 52 | Dell | S6000-ON | Broadcom | Trident 2 | 32x40G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 53 | Dell | S6100-ON | Broadcom | Tomahawk | 64x40G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 54 | Dell | Z9100-ON | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 55 | Dell | Z9264F-ON | Broadcom | Tomahawk 2 | 64x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 56 | Dell | Z9332F-ON | Broadcom | Tomahawk 3 | 32x400G,2x10G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 57 | Dell | Z9332f-C32 | Broadcom | Tomahawk 3 | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 58 | Delta | AG5648 | Broadcom | Tomahawk | 48x25G + 6x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 59 | Delta | AG9032V1 | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 60 | Delta | AG9032V2A | Broadcom | Trident 3 | 32x100G + 1x10G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 61 | Delta | AG9064 | Broadcom | Tomahawk 2 | 64x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 62 | Delta | et-c032if | Marvell | Teralynx 7 | 32x400G |[SONiC-ONIE-Innovium]($(echo "${ARTF_INNO}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-innovium-dbg.bin/')) |" >> supported_devices_platforms.md +echo "| 63 | Delta | ET-6448M | Marvell | Prestera 98DX3255 | 48xGE + 4x10G | [SONiC-ONIE-Marvell]($(echo "${ARTF_MRV}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-marvell-armhf.bin/')) |" >> supported_devices_platforms.md +echo "| 64 | Delta | agc032 | Broadcom | Tomahawk3 | 32x400G + 2x10G | [SONiC-ONIE-Marvell]($(echo "${ARTF_MRV}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-marvell-armhf.bin/')) |" >> supported_devices_platforms.md +echo "| 65 | Embedway | ES6220 (48x10G) | Centec | Goldengate | 48x10G + 2x40G + 4x100G | [SONiC-ONIE-Centec]($(echo "${ARTF_CTC}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-centec.bin/')) |" >> supported_devices_platforms.md +echo "| 66 | Embedway | ES6428A-X48Q2H4 | Centec | Goldengate | 4x100G + 2x40G + 48x10G | [SONiC-ONIE-Centec]($(echo "${ARTF_CTC}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-centec.bin/')) |" >> supported_devices_platforms.md +echo "| 67 | Facebook | Wedge 100-32X | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 68 | Ingrasys | S8810-32Q | Broadcom | Trident 2 | 32x40G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 69 | Ingrasys | S8900-54XC | Broadcom | Tomahawk | 48x25G + 6x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 70 | Ingrasys | S8900-64XC | Broadcom | Tomahawk | 48x25G + 16x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 71 | Ingrasys | S9100-32X | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 72 | Ingrasys | S9130-32X | Nephos | Taurus | 32x100G | [SONiC-ONIE-Nephos]($(echo "${ARTF_NPH}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-nephos.bin/')) |" >> supported_devices_platforms.md +echo "| 73 | Ingrasys | S9180-32X | Intel | Tofino | 32x100G | [SONiC-ONIE-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-barefoot.bin/')) |" >> supported_devices_platforms.md +echo "| 74 | Ingrasys | S9200-64X | Broadcom | Tomahawk 2 | 64x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 75 | Ingrasys | S9230-64X | Nephos | Taurus | 64x100G | [SONiC-ONIE-Nephos]($(echo "${ARTF_NPH}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-nephos.bin/')) |" >> supported_devices_platforms.md +echo "| 76 | Ingrasys | S9280-64X | Intel | Tofino | 64x100G | [SONiC-ONIE-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-barefoot.bin/')) |" >> supported_devices_platforms.md +echo "| 77 | Inventec | D6254QS | Broadcom | Trident 2 | 72x10G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 78 | Inventec | D6356 | Broadcom | Trident 3 | 48x25G + 8x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 79 | Inventec | D6556 | Broadcom | Trident 3 | 48x25G + 8x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 80 | Inventec | D7032Q | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 81 | Inventec | D7054Q | Broadcom | Tomahawk | 48x25G + 6x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 82 | Inventec | D7264Q | Broadcom | Tomahawk 2 | 64x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 83 | Juniper Networks| QFX5210-64C | Broadcom | Tomahawk 2 | 64x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 84 | Juniper Networks| QFX5200-32C-S | Broadcom | Tomahawk 1 | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 85 | Marvell | RD-ARM-48XG6CG-A4 | Marvell | Prestera 98EX54xx | 6x100G+48x10G | [SONiC-ONIE-Marvell]($(echo "${ARTF_MRV}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-marvell-armhf.bin/')) |" >> supported_devices_platforms.md +echo "| 86 | Marvell | RD-BC3-4825G6CG-A4 | Marvell | Prestera 98CX84xx | 6x100G+48x25G | [SONiC-ONIE-Marvell]($(echo "${ARTF_MRV}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-marvell-armhf.bin/')) |" >> supported_devices_platforms.md +echo "| 87 | Marvell | 98cx8580 | Marvell | Prestera CX | 32x400G + 16x400G | [SONiC-ONIE-Marvell]($(echo "${ARTF_MRV}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-marvell-armhf.bin/')) |" >> supported_devices_platforms.md +echo "| 88 | Nvidia | SN2010 | Nvidia | Spectrum | 18x25G + 4x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md +echo "| 89 | Nvidia | SN2100 | Nvidia | Spectrum | 16x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md +echo "| 90 | Nvidia | SN2410 | Nvidia | Spectrum | 48x25G + 8x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md +echo "| 91 | Nvidia | SN2700 | Nvidia | Spectrum | 32x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md +echo "| 92 | Nvidia | SN3420 | Nvidia | Spectrum 2 | 48x25G + 12x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md +echo "| 93 | Nvidia | SN3700 | Nvidia | Spectrum 2 | 32x200G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md +echo "| 94 | Nvidia | SN3700C | Nvidia | Spectrum 2 | 32x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md +echo "| 95 | Nvidia | SN3800 | Nvidia | Spectrum 2 | 64x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md +echo "| 96 | Nvidia | SN4600C | Nvidia | Spectrum 3 | 64x100G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md +echo "| 97 | Nvidia | SN4700 | Nvidia | Spectrum 3 | 32x400G | [SONiC-ONIE-Mellanox]($(echo "${ARTF_MLNX}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-mellanox.bin/')) |" >> supported_devices_platforms.md +echo "| 98 | Mitac | LY1200-B32H0-C3 | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 99 | Pegatron | Porsche | Nephos | Taurus | 48x25G + 6x100G | [SONiC-ONIE-Nephos]($(echo "${ARTF_NPH}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-nephos.bin/')) |" >> supported_devices_platforms.md +echo "| 100 | Quanta | T3032-IX7 | Broadcom | Trident 3 | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 101 | Quanta | T4048-IX8 | Broadcom | Trident 3 | 48x25G + 8x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 102 | Quanta | T4048-IX8C | Broadcom | Trident 3 | 48x25G + 8x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 103 | Quanta | T7032-IX1B | Broadcom | Tomahawk | 32x100G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 104 | Quanta | T9032-IX9 | Broadcom | Tomahawk 3 | 32x400G | [SONiC-ONIE-Broadcom]($(echo "${ARTF_BRCM}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-broadcom.bin/')) |" >> supported_devices_platforms.md +echo "| 105 | Wnc | OSW1800 | Intel | Tofino | 48x25G + 6x100G | [SONiC-ONIE-Barefoot]($(echo "${ARTF_BFT}" | sed 's/format=zip/format=file\&subpath=\/target\/sonic-barefoot.bin/')) |" >> supported_devices_platforms.md From dab78bda934ec5233676b6973b88b1ff61cd00da Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Thu, 21 Jul 2022 11:22:19 +0800 Subject: [PATCH 51/60] Update bulk counter HLD (#1029) * Upgrade bulk counter HLD * Fix typo --- doc/bulk_counter/bulk_counter.md | 50 +++++++++---------- doc/bulk_counter/counter_collect.svg | 2 +- .../object_join_counter_group.svg | 2 +- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/doc/bulk_counter/bulk_counter.md b/doc/bulk_counter/bulk_counter.md index f4eb344a6d..c3e963ad1e 100644 --- a/doc/bulk_counter/bulk_counter.md +++ b/doc/bulk_counter/bulk_counter.md @@ -23,28 +23,26 @@ PR https://github.com/opencomputeproject/SAI/pull/1352/files introduced new SAI - sai_bulk_object_get_stats - sai_bulk_object_clear_stats -SONiC flex counter infrastructure shall utilize bulk stats API to gain better performance. This document discusses how to integrate these two new APIs to SONiC. +SONiC flex counter infrastructure shall utilize bulk stats API to gain better performance. This document discusses how to integrate these two new APIs to SONiC. ### Requirements - Syncd shall use bulk stats APIs based on object type. E.g. for a counter group that queries queue and pg stats, queue stats support bulk while pg stats does not, in that case queue stats shall use bulk API, pg stats shall use non bulk API -- For a certain object type in a counter group, it shall use bulk stats only if: - - The stats capability for each counter IDs shall match the stats mode of the counter group - - Each object queries exactly the same counter IDs. (Requirement from function signature of sai_bulk_object_get_stats and sai_bulk_object_clear_stats) +- For a certain object in a counter group, it shall use bulk stats only if all counter IDs support bulk API - Syncd shall automatically fall back to old way if bulk stats APIs are not supported -- Syncd shall utilize API sai_query_stats_capability to query bulk capability. Syncd shall treat counter as no bulk capability if API sai_query_stats_capability return error except SAI_STATUS_BUFFER_OVERFLOW (SAI_STATUS_BUFFER_OVERFLOW requires a retry with larger buffer) -- Syncd shall call bulk stats API in flex counter thread and avoid calling it in main thread to make sure main thread only handles short and high priority tasks. (This is the default behavior in flex counter infrastructure) +- Syncd shall utilize sai_bulk_object_get_stats/sai_bulk_object_clear_stats to query bulk capability. Syncd shall treat counter as no bulk capability if API return error +- Syncd shall call bulk stats API in flex counter thread and avoid calling it in main thread to make sure main thread only handles short and high priority tasks. (This is the default behavior in current flex counter infrastructure) - In phase 1, the change is limited to syncd only, no CLI/swss change. Syncd shall deduce the bulk stats mode according to the stats mode defined in FLEX DB: - SAI_STATS_MODE_READ -> SAI_STATS_MODE_BULK_READ - SAI_STATS_MODE_READ_AND_CLEAR -> SAI_STATS_MODE_BULK_READ_AND_CLEAR ### Architecture Design -For each counter group, different statistic type is allowed to chooose bulk or non-bulk API based on SAI capability. +For each counter group, different statistic type is allowed to choose bulk or non-bulk API based on vendor SAI implementation. ![architecture](/doc/bulk_counter/bulk_counter.svg). -> Note: In the picture, pg/queue watermark statistic use bulk API and buffer watermark statistic uses non-bulk API. This is just an example to show the design idea. +> Note: In the picture, pg/queue watermark statistic use bulk API and buffer watermark statistic uses non-bulk API. This is just an example to show the design idea. ### High-Level Design @@ -56,7 +54,7 @@ Changes shall be made to sonic-sairedis to support this feature. No CLI change. ##### Bulk Statistic Context -A new structure shall be added to FlexCounter class. +A new structure shall be added to FlexCounter class. This structure is created because: @@ -64,35 +62,32 @@ This structure is created because: - Avoid constructing these information each time collecting statistic. The bulk context shall only be updated under below cases: - New object join counter group. E.g. adding a new port object. - Existing object leave counter group. E.g removing an existing port object. - - Other case such as counter IDs is updated by user. + - Other case such as counter IDs is updated by upper layer. ```cpp struct BulkStatsContext { sai_object_type_t object_type; std::vector object_vids; - std::vector object_keys; + std::vector object_keys; std::vector counter_ids; - std::vector statuses; + std::vector object_statuses; std::vector counters; - std::shared_ptr stats_capas; }; ``` - object_type: object type. -- object_keys: objects that participate the bulk call. E.g. for port, SAI object id value shall be put into sai_object_key_t structure. +- object_vids: virtual IDs. +- object_keys: real IDs. - counter_ids: SAI statistic IDs that will be queried/cleared by the bulk call. -- statuses: SAI bulk API return value for each object. +- object_statuses: SAI bulk API return value for each object. - counters: counter values that will be fill by vendor SAI. -- stats_capas: stats capability for each statitstic IDs for current object type. The flow of how to updating bulk context will be discussed in following section. -For a given object type, diffrent object instance may support different stats capability, so, a list of BulkStatsContext shall be added to FlexCounter class for each object type. +For a given object type, different object instance may support different stats capability, so, a map of BulkStatsContext shall be added to FlexCounter class for each object type. ```cpp - -std::vector m_portBulkContexts; -std::vector m_priorityGroupBulkContexts; +std::map, BulkStatsContext> m_portBulkContexts; ... ``` @@ -124,7 +119,7 @@ N/A No extra logic on SONiC side is needed to handle warmboot/fastboot. -- As fastboot dealys all counters querying, this feature does not affect fastboot. +- As fastboot delays all counters querying, this feature does not affect fastboot. - For warmboot, it is vendor SAI implementation's responsible to make sure that there must be no error if warmboot starts while bulk API is called. ### Restrictions/Limitations @@ -135,12 +130,12 @@ No extra logic on SONiC side is needed to handle warmboot/fastboot. ### Performance Improvement -A rough test has been done on Nvidia platform for queue. +A rough test has been done on Nvidia platform for queue. - Non bulk API: get stats for one queue takes X seconds; get stats for 32 port * 8 queue is 256X seconds; - Bulk API: get stats for one queue takes Y seconds; get stats for 32 port * 8 queue is almost Y seconds; -X is almost euqal to Y. So, more object instances, more performance improvement. +X is almost equal to Y. So, more object instances, more performance improvement. ### Testing Requirements/Design @@ -148,5 +143,10 @@ As this feature does not introduce any new function, unit test shall be good eno #### Unit Test cases -- test_update_bulk_context -- test_bulk_collect_stats +- addRemoveBulkCounter +- counterIdChange + - not support bulk -> support bulk + - support bulk but counter IDs change + - support bulk with different counter IDs + - support bulk -> not support bulk + - not support bulk but counter IDs change diff --git a/doc/bulk_counter/counter_collect.svg b/doc/bulk_counter/counter_collect.svg index f8d4364f46..cc167c4fda 100644 --- a/doc/bulk_counter/counter_collect.svg +++ b/doc/bulk_counter/counter_collect.svg @@ -1 +1 @@ -
Collect stats start
Collect stats start
Old way
Old way
Support bulk?
Support bulk?
Call sai_object_bulk_get_stats
Call sai_object_bulk...
Success?
Success?
Need Clear?
Need Clear?
Call sai_object_bulk_clear_stats
Call sai_object_bulk...
Success?
Success?
Fill Counters DB
Fill Counters DB
yes
yes
no
no
yes
yes
no
no
no
no
no
no
yes
yes
yes
yes
Viewer does not support full SVG 1.1
\ No newline at end of file +
For each bulk context
For each bulk context
Call sai_object_bulk_get_stats
Call sai_object_bulk...
Success?
Success?
Fill Counters DB
Fill Counters DB
yes
yes
Log warning
Log warning
For each item in object_statuses
For each item in obj...
Success?
Success?
Log error
Log error
yes
yes
no
no
no
no
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/doc/bulk_counter/object_join_counter_group.svg b/doc/bulk_counter/object_join_counter_group.svg index 5b242c530f..ce5475b421 100644 --- a/doc/bulk_counter/object_join_counter_group.svg +++ b/doc/bulk_counter/object_join_counter_group.svg @@ -1 +1 @@ -
New entry to FlexCounter table
New entry to FlexCou...
Query stats capability
Query stats capabili...
Extract object ID and counter IDs
Extract object ID an...
FlexCounter::addCounter
FlexCounter::addCoun...
Success?
Success?
All Counter IDs support bulk?
All Counter IDs support b...
Bulk not supported
Bulk not supported
yes
yes
no
no
yes
yes
no
no
Find existing bulk context?
Find existing bulk contex...
Update bulk context
Update bulk context
yes
yes
no
no
Create bulk context
Create bulk context
Viewer does not support full SVG 1.1
\ No newline at end of file +
New entry to FlexCounter table
New entry to FlexCou...
Get supported counter IDs
Get supported counte...
Extract object ID and counter IDs
Extract object ID an...
FlexCounter::addCounter
FlexCounter::addCoun...
Success?
Success?
All Counter IDs support bulk?
All Counter IDs support b...
Bulk not supported
Bulk not supported
yes
yes
no
no
yes
yes
no
no
Find existing bulk context?
Find existing bulk contex...
Update bulk context
Update bulk context
yes
yes
no
no
Create bulk context
Create bulk context
Viewer does not support full SVG 1.1
\ No newline at end of file From e6f9fead861f972f82755defce3bd2215c11cf92 Mon Sep 17 00:00:00 2001 From: jingwenxie Date: Wed, 3 Aug 2022 07:44:35 +0800 Subject: [PATCH 52/60] Add link for existing GCU test, remove BBR test as it is no longer needed (#943) --- ...eneric_Config_Update_and_Rollback_Design.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/config-generic-update-rollback/SONiC_Generic_Config_Update_and_Rollback_Design.md b/doc/config-generic-update-rollback/SONiC_Generic_Config_Update_and_Rollback_Design.md index ac26a1f5c6..246b204d6b 100644 --- a/doc/config-generic-update-rollback/SONiC_Generic_Config_Update_and_Rollback_Design.md +++ b/doc/config-generic-update-rollback/SONiC_Generic_Config_Update_and_Rollback_Design.md @@ -908,19 +908,19 @@ N/A | 14 | Dynamic port breakout as described [here](https://github.com/Azure/SONiC/blob/master/doc/dynamic-port-breakout/sonic-dynamic-port-breakout-HLD.md).| | 15 | Remove an item that has a default value. | | 16 | Modifying items that rely depends on each other based on a `must` condition rather than direct connection such as `leafref` e.g. /CRM/acl_counter_high_threshold (check [here](https://github.com/Azure/sonic-buildimage/blob/master/src/sonic-yang-models/yang-models/sonic-crm.yang)). | -| 17 | Updating Syslog configs. | -| 18 | Updating AAA configs. | -| 19 | Updating DHCP configs. | +| 17 | [Updating Syslog configs.](https://github.com/Azure/sonic-mgmt/blob/master/tests/generic_config_updater/test_syslog.py) | +| 18 | [Updating AAA configs.](https://github.com/Azure/sonic-mgmt/blob/master/tests/generic_config_updater/test_aaa.py) | +| 19 | [Updating DHCP configs.](https://github.com/Azure/sonic-mgmt/blob/master/tests/generic_config_updater/test_dhcp_relay.py) | | 20 | Updating IPv6 configs. | | 21 | Updating monitor configs (EverflowAlaysOn). | | 22 | Updating BGP speaker configs. | -| 23 | Updating BGP listener configs. | -| 24 | Updating Bounce Back Routing configs. | -| 25 | Updating control-plane ACLs (NTP, SNMP, SSH) configs. | +| 23 | [Updating BGP listener configs.](https://github.com/Azure/sonic-mgmt/blob/master/tests/generic_config_updater/test_bgpl.py) | +| 24 | ~~Updating Bounce Back Routing configs.~~ | +| 25 | [Updating control-plane ACLs (NTP, SNMP, SSH) configs.](https://github.com/Azure/sonic-mgmt/blob/master/tests/generic_config_updater/test_cacl.py) | | 26 | Updating Ethernet interfaces configs. | -| 27 | Updating VLAN interfaces configs. | -| 28 | Updating port-channel interfaces configs. | -| 29 | Updating loopback interfaces configs. | +| 27 | [Updating VLAN interfaces configs.](https://github.com/Azure/sonic-mgmt/blob/master/tests/generic_config_updater/test_vlan_interface.py) | +| 28 | [Updating port-channel interfaces configs.](https://github.com/Azure/sonic-mgmt/blob/master/tests/generic_config_updater/test_portchannel_interface.py) | +| 29 | [Updating loopback interfaces configs.](https://github.com/Azure/sonic-mgmt/blob/master/tests/generic_config_updater/test_lo_interface.py) | | 30 | Updating BGP prefix hijack configs. | | 31 | Updating QoS headroom pool and buffer pool size. | | 32 | Add/Remove Rack. | From b2604e3bea89e0cd5f6a1d641dd0fcaf515aeea7 Mon Sep 17 00:00:00 2001 From: Yanzhao Zhang Date: Tue, 2 Aug 2022 17:57:23 -0700 Subject: [PATCH 53/60] update URLs from Azure to sonic-net --- sourcecode.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/sourcecode.md b/sourcecode.md index 72efae900c..6ee6626c3a 100644 --- a/sourcecode.md +++ b/sourcecode.md @@ -4,7 +4,7 @@ ## Imaging and Building tools ### sonic-buildimage -- https://github.com/Azure/sonic-buildimage +- https://github.com/sonic-net/sonic-buildimage - Main repo that contains SONiC code,links to all sub-repos, build related files, platform/device specific files, etc., This repo has the following directories. - device - It contains files specific to each vendor device. In general, it contains the python scripts for accessing EEPROM, SFP, PSU, LED,etc., specific to the device hardware. @@ -29,14 +29,14 @@ ## SAI, Switch State Service ### sonic-swss -- https://github.com/Azure/sonic-swss +- https://github.com/sonic-net/sonic-swss - Switch State Service - Core component of SONiC which processes network switch data - The SWitch State Service (SWSS) is a collection of software that provides a database interface for communication with and state representation of network applications and network switch hardware. - - This repository contains the source code for the swss container, teamd container & bgp container shown in the [architecture diagram](https://github.com/Azure/SONiC/blob/master/images/sonic_user_guide_images/section4_images/section4_pic1_high_level.png "High Level Component Interactions") + - This repository contains the source code for the swss container, teamd container & bgp container shown in the [architecture diagram](https://github.com/sonic-net/SONiC/blob/master/images/sonic_user_guide_images/section4_images/section4_pic1_high_level.png "High Level Component Interactions") - When swss container is started, start.sh starts the processes like rsyslogd, orchagent, restore_neighbors, portsyncd, neighsyncd, swssconfig, vrfmgrd, vlanmgrd, intfmgrd, portmgrd, buffermgrd, enable_counters, nbrmgrd, vxlanmgrd & arp_update. SWWS repository contains the source code for the following. - - cfgmgr - This directory contains the code to build the following processes that run inside swss container. More details about each deamon is available in the [architecture document](https://github.com/Azure/SONiC/wiki/Architecture). + - cfgmgr - This directory contains the code to build the following processes that run inside swss container. More details about each deamon is available in the [architecture document](https://github.com/sonic-net/SONiC/wiki/Architecture). - nbrmgrd - manager for neighbor management - Listens to neighbor-related changes in NEIGH_TABLE in ConfigDB for static ARP/ND configuration and also to trigger proactive ARP (for potential VxLan Server IP address by not specifying MAC) and then uses netlink to program the neighbors in linux kernel. nbrmgrd does not write anything in APP_DB. - portmgrd - manager for Port management - Listens to port-related changes in ConfigDB and sets the MTU and/or AdminState in kernel using "ip" commands and also pushes the same to APP_DB. - buffermgrd - manager for buffer management - Reads buffer profile config file and programs it in ConfigDB and then listens (at runtime) for cable length change and speed change in ConfigDB, and sets the same into buffer profile table ConfigDB. @@ -56,7 +56,7 @@ ### sonic-swss-common -- https://github.com/Azure/sonic-swss-common +- https://github.com/sonic-net/sonic-swss-common - Switch State Service common library - Common library for Switch State Service ### Opencomputeproject/SAI @@ -64,7 +64,7 @@ - This repo refers/uses the SAI sub-repo from OCP github that includes the required SAI header files. ### sonic-sairedis -- https://github.com/Azure/sonic-sairedis +- https://github.com/sonic-net/sonic-sairedis - This repo contains the C++ library code for interfacing to SAI objects in Redis - The SAI Redis provides a SAI redis service that built on top of redis database. - It contains two major components @@ -75,13 +75,13 @@ ### sonic-dbsyncd -- https://github.com/Azure/sonic-dbsyncd +- https://github.com/sonic-net/sonic-dbsyncd - Python Redis common functions for LLDP - This repo contains the code for SONiC Switch State Service sync daemon for LLDP data. Scripts upload lldp information to Redis DB ### sonic-py-swsssdk -- https://github.com/Azure/sonic-py-swsssdk +- https://github.com/sonic-net/sonic-py-swsssdk - This repo contains python utility library for SWSS DB access. - configdb.py - This provides utilities like ConfigDBConnector, db_connect, connect, subscribe, listen, set_entry, mod_entry, get_entry, get_keys, get_table, delete_table, mod_config, get_config, etc., - dbconnector.py - It contains utilities like SonicV1Connector, SonicV2Connector, etc., @@ -92,18 +92,18 @@ ### sonic-quagga -- https://github.com/Azure/sonic-quagga/tree/debian/0.99.24.1 +- https://github.com/sonic-net/sonic-quagga/tree/debian/0.99.24.1 - This repo contains code for the Quagga routing software which is a free software that manages various IPv4 and IPv6 routing protocols. Currently Quagga supports BGP4, BGP4+, OSPFv2, OSPFv3, RIPv1, RIPv2, and RIPng as well as very early support for IS-IS. ## Monitoring and management tools ### sonic-mgmt -- https://github.com/Azure/sonic-mgmt +- https://github.com/sonic-net/sonic-mgmt - Management and automation code used for build, test and deployment automation ### sonic-utilities -- https://github.com/Azure/sonic-utilities +- https://github.com/sonic-net/sonic-utilities - This repository contains the code for Command Line Interfaces for SONiC. - Folders like "config", "show", "clear" contain the CLI commands - Folders like "scripts", "sfputil", "psuutil" & "acl_loader" contain the scripts that are used by the CLI commands. These scripts are not supposed to be directly called by user. All these scripts are wrapped under the "config" and "show" commands. @@ -115,7 +115,7 @@ ### sonic-snmpagent -- https://github.com/Azure/sonic-snmpagent +- https://github.com/sonic-net/sonic-snmpagent - This repo contains the net-snmpd AgentX SNMP subagent implementation for supporting the MIBs like MIB-II, Physical Table MIB, Interfaces MIB, Sensor Table MIB, ipCidrRouteDest table in IP Forwarding Table MIB, dot1qTpFdbPort in Q-BRIDGE-MIB & LLDP MIB. - The python scripts present in this repo are used as part of the "snmp" docker that runs in SONiC. @@ -123,13 +123,13 @@ ## Switch hardware drivers ### sonic-linux-kernel -- https://github.com/Azure/sonic-linux-kernel +- https://github.com/sonic-net/sonic-linux-kernel - This repo contains the Kernel patches for various device drivers. - This downloads the appropriate debian kernel code, applies the patches and builds the custom kernel for SONiC. ### sonic-platform-common -- https://github.com/Azure/sonic-platform-common +- https://github.com/sonic-net/sonic-platform-common - This repo contains code which is to be shared among all platforms for interfacing with platform-specific peripheral hardware. - It contains the APIs for implementing platform-specific functionality in SONiC - It provides the base class for peripherals like EEPROM, LED, PSU, SFP, chassis, device, fan, module, platform, watchdog, etc., that are used for existing platform code as well as for the new platform API. @@ -137,7 +137,7 @@ - New platform2.0 APIs are defined in the base classes inside "sonic_platform_base" folder. ### sonic-platform-daemons -- https://github.com/Azure/sonic-platform-daemons +- https://github.com/sonic-net/sonic-platform-daemons - This repo contains the daemons for controlling platform-specific functionality in SONiC - This repo contains python scripts for platform daemons that listens for events from Optics, LED & PSU and writes them in the STATE_DB - xcvrd - This listens for SFP events and writes the status to STATE_DB. From f34c5fa13061392f533f2e52ff32020cc0a6bd30 Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Mon, 8 Aug 2022 20:41:07 +0800 Subject: [PATCH 54/60] Update psud according to the current implementation (#1047) Update PSU daemon design according to current implementation Signed-off-by: Stephen Sun --- doc/psud/PSU_daemon_design.md | 40 ++++++++++++++----- .../PSU-daemon-data-collection-flow.svg | 4 ++ 2 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 doc/psud/PSU_daemon_design_pictures/PSU-daemon-data-collection-flow.svg diff --git a/doc/psud/PSU_daemon_design.md b/doc/psud/PSU_daemon_design.md index cc65015e9f..f3e9006263 100644 --- a/doc/psud/PSU_daemon_design.md +++ b/doc/psud/PSU_daemon_design.md @@ -1,27 +1,35 @@ # SONiC PSU Daemon Design # -### Rev 0.1 ### +### Rev 0.2 ### ### Revision ### | Rev | Date | Author | Change Description | |:---:|:-----------:|:------------------:|-----------------------------------| | 0.1 | | Chen Junchao | Initial version | - + | 0.2 | August 4st, 2022 | Stephen Sun | Update according to the current implementation | ## 1. Overview The purpose of PSU daemon is to collect platform PSU data and trigger proper actions if necessary. Major functions of psud include: - Collect constant PSU data during daemon boot up, such as PSU number. -- Collect variable PSU data periodically. -- Monitor PSU event, set LED color and trigger syslog according to event type. +- Collect variable PSU data periodically, including: + - PSU entity information + - PSU present status and power good status + - PSU power, current, voltage and voltage threshold + - PSU temperature and temperature threshold +- Monitor PSU event, set LED color and trigger syslog according to event type, including: + - PSU present status and power good status + - whether the PSU voltage exceeds the minimal and maximum thresholds + - whether the PSU temperature exceeds the threshold + - whether the total PSU power consumption exceeds the budget (modular switch only) ## 2. PSU data collection PSU daemon data collection flow diagram: -![](https://github.com/Azure/SONiC/blob/master/doc/pmon/daemon-flow.svg) +![](PSU_daemon_design_pictures/PSU-daemon-data-collection-flow.svg) Now psud collects PSU data via platform API, and it also support platform plugin for backward compatible. All PSU data will be saved to redis database for further usage. @@ -34,13 +42,23 @@ PSU information is stored in PSU table: ; Defines information for a psu key = PSU_INFO|psu_name ; information for the psu ; field = value - presence = BOOLEAN ; presence of the psu + presence = BOOLEAN ; presence state of the psu model = STRING ; model name of the psu serial = STRING ; serial number of the psu + revision = STRING ; hardware revision of the PSU status = BOOLEAN ; status of the psu change_event = STRING ; change event of the psu fan = STRING ; fan_name of the psu led_status = STRING ; led status of the psu + is_replaceable = STRING ; whether the PSU is replaceable + temp = 1*3.3DIGIT ; temperature of the PSU + temp_threshold = 1*3.3DIGIT ; temperature threshold of the PSU + voltage = 1*3.3DIGIT ; the output voltage of the PSU + voltage_min_threshold = 1*3.3DIGIT ; the minimal voltage threshold of the PSU + voltage_max_threshold = 1*3.3DIGIT ; the maximum voltage threshold of the PSU + current = 1*3.3DIGIT ; the current of the PSU + power = 1*3.3DIGIT ; the power of the PSU + Now psud only collect and update "presence" and "status" field. @@ -72,10 +90,10 @@ The current output for "show platform psustatus" looks like: ``` admin@sonic:~$ show platform psustatus -PSU Status ------ -------- -PSU 1 OK -PSU 2 OK +PSU Model Serial HW Rev Voltage (V) Current (A) Power (W) Status LED +----- ------------- ------------ -------- ------------- ------------- ----------- -------- ----- +PSU 1 MTEF-PSF-AC-A MT1629X14911 A3 12.09 5.44 64.88 OK green +PSU 2 MTEF-PSF-AC-A MT1629X14913 A3 12.02 4.69 56.25 OK green ``` ## 5. PSU LED management @@ -147,4 +165,4 @@ Supervisord takes charge of this daemon. This daemon will loop every 3 seconds a - The psu_num will store in "chassis_info" table. It will just be invoked one time when system boot up or reload. The key is chassis_name, the field is "psu_num" and the value is from get_psu_num(). - The psu_status and psu_presence will store in "psu_info" table. It will be updated every 3 seconds. The key is psu_name, the field is "presence" and "status", the value is from get_psu_presence() and get_psu_num(). -- The daemon query PSU event every 10 seconds via platform API. If any event detects, it should set PSU LED color accordingly and trigger proper syslog. +- The daemon query PSU event every 3 seconds via platform API. If any event detects, it should set PSU LED color accordingly and trigger proper syslog. diff --git a/doc/psud/PSU_daemon_design_pictures/PSU-daemon-data-collection-flow.svg b/doc/psud/PSU_daemon_design_pictures/PSU-daemon-data-collection-flow.svg new file mode 100644 index 0000000000..72081ced92 --- /dev/null +++ b/doc/psud/PSU_daemon_design_pictures/PSU-daemon-data-collection-flow.svg @@ -0,0 +1,4 @@ + + + +
alt
alt
loop
loop
daemon
daemon
wait for the device ready
wait for the device ready
platfrom util
platfrom util
device driver
device driver
State DB
State DB
get constant info at init
get constant info at init
return
return
read constant info
read constant info
return
return
update DB
update DB
get variable info
get variable info
return
return
read variable info
read variable info
return
return
update DB with dom info
update DB with dom info
update db with variable info
update db with variable info
refresh time out
refresh time out
Text is not SVG - cannot display
\ No newline at end of file From 3f0ba59d65a5760b24c71dea6f25b7223fce8ba2 Mon Sep 17 00:00:00 2001 From: Volodymyr Samotiy Date: Mon, 8 Aug 2022 19:30:39 +0300 Subject: [PATCH 55/60] [crm] Align THRESHOLD_CLEAR log message severity in HLD according to implementation (#1046) * First it was planned to have THRESHOLD_CLEAR message as NOTICE. * But during implementation it was requested to change it to WARNING. * In order to be consistent with THRESHOLD_EXCEEDED message which is WARNING. * So CRM implementation has WARNING severity for both messages from day 1. * But HLD was not update accordingly and this change updates it to be aligned. Signed-off-by: Volodymyr Samotiy --- doc/crm/Critical-Resource-Monitoring-High-Level-Design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/crm/Critical-Resource-Monitoring-High-Level-Design.md b/doc/crm/Critical-Resource-Monitoring-High-Level-Design.md index 90e4c12048..8aca334897 100644 --- a/doc/crm/Critical-Resource-Monitoring-High-Level-Design.md +++ b/doc/crm/Critical-Resource-Monitoring-High-Level-Design.md @@ -104,7 +104,7 @@ Monitoring process should periodically poll SAI counters for all required resour ```" WARNING : THRESHOLD_EXCEEDED for <%> Used count free count "``` -```" NOTICE : THRESHOLD_CLEAR for <%> Used count free count "``` +```" WARNING : THRESHOLD_CLEAR for <%> Used count free count "``` ``` = ``` From 7b32db8110450ddc5777022bc23da3f60b555618 Mon Sep 17 00:00:00 2001 From: ntoorchi <52223501+ntoorchi@users.noreply.github.com> Date: Fri, 12 Aug 2022 16:12:28 -0700 Subject: [PATCH 56/60] Adding P4RT app configuration (#1054) *P4RT app configuration is added to HLD. --- doc/pins/p4rt_app_hld.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/doc/pins/p4rt_app_hld.md b/doc/pins/p4rt_app_hld.md index 5aa70ef738..a1da70af65 100644 --- a/doc/pins/p4rt_app_hld.md +++ b/doc/pins/p4rt_app_hld.md @@ -16,6 +16,7 @@ _Rev v0.1_ * [Response path](#response-path) - [APPL DB Schema High-Level Design](#appl-db-schema-high-level-design) - [Testing Requirements/Design](#testing-requirements-design) +- [Configuring P4RT Application](#configuring-p4rt-application) - [Open/Action items - if any](#open-action-items---if-any) ## Revision @@ -164,6 +165,29 @@ P4RT application introduces new tables that are written to APPL_DB for the table The P4RT application code will have unit & component tests that together will give >80% code coverage. +## Configuring P4RT Application + +The P4RT application is configured at the start-up by reading the P4RT configuration from the CONFIG_DB. If no valid config exists in CONFIG_DB, it uses the default values. The configuration can be added to the CONFIG_DB by being manually added to the config_db.json file. The P4RT container will need to be restarted if the configuration is changed. + +Below is an example of adding P4RT configuration to config_db.json. The user can modify this block based on their environment settings. + +``` +"P4RT": { + "certs": { + "server_crt": "/keys/server_cert.lnk", + "server_key": "/keys/server_key.lnk", + "ca_crt": "/keys/ca_cert.lnk", + "cert_crl_dir": "/keys/crl" + }, + "p4rt_app": { + "port": "9559", + "use_genetlink": "false", + "use_port_ids": "false", + "save_forwarding_config_file" : "/etc/sonic/p4rt_forwarding_config.pb.txt", + "authz_policy": "/keys/authorization_policy.json" + } +} +``` ## Open/Action items - if any From de52a488b6d690b60d4bf872654e2ab2f627f54e Mon Sep 17 00:00:00 2001 From: kannankvs Date: Wed, 17 Aug 2022 10:33:10 +0530 Subject: [PATCH 57/60] Update on Index file (#1042) Updated Index file for font alignment (wiki, github, linux foundation) and link change for Sonic build image url Co-authored-by: Xin Liu --- index.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/index.html b/index.html index 75f120a000..2c088d2205 100644 --- a/index.html +++ b/index.html @@ -95,7 +95,7 @@

  • Building Guide
  • Testing Guide
  • Technical FAQ
  • -
  • SONiC Latest Images
  • +
  • SONiC Latest Images